对象变体
在需要简单变体类型的某些情况下,对象层次结构通常是过度的。
一个示例:
- # 这是一个如何在Nim中建模抽象语法树的示例
- type
- NodeKind = enum # 不同节点类型
- nkInt, # 整型值叶节点
- nkFloat, # 浮点型叶节点
- nkString, # 字符串叶节点
- nkAdd, # 加法
- nkSub, # 减法
- nkIf # if语句
- Node = ref object
- case kind: NodeKind # ``kind`` 字段是鉴别字段
- of nkInt: intVal: int
- of nkFloat: floatVal: float
- of nkString: strVal: string
- of nkAdd, nkSub:
- leftOp, rightOp: Node
- of nkIf:
- condition, thenPart, elsePart: Node
- var n = Node(kind: nkFloat, floatVal: 1.0)
- # 以下语句引发了一个`FieldError`异常,因为 n.kind的值不匹配:
- n.strVal = ""
从该示例可以看出,对象层次结构的优点是不需要在不同对象类型之间进行转换。但是,访问无效对象字段会引发异常。