对象变体

在需要简单变体类型的某些情况下,对象层次结构通常是过度的。

一个示例:

  1. # 这是一个如何在Nim中建模抽象语法树的示例
  2. type
  3. NodeKind = enum # 不同节点类型
  4. nkInt, # 整型值叶节点
  5. nkFloat, # 浮点型叶节点
  6. nkString, # 字符串叶节点
  7. nkAdd, # 加法
  8. nkSub, # 减法
  9. nkIf # if语句
  10. Node = ref object
  11. case kind: NodeKind # ``kind`` 字段是鉴别字段
  12. of nkInt: intVal: int
  13. of nkFloat: floatVal: float
  14. of nkString: strVal: string
  15. of nkAdd, nkSub:
  16. leftOp, rightOp: Node
  17. of nkIf:
  18. condition, thenPart, elsePart: Node
  19.  
  20. var n = Node(kind: nkFloat, floatVal: 1.0)
  21. # 以下语句引发了一个`FieldError`异常,因为 n.kind的值不匹配:
  22. n.strVal = ""

从该示例可以看出,对象层次结构的优点是不需要在不同对象类型之间进行转换。但是,访问无效对象字段会引发异常。