属性

如上例所示,Nim不需要 get-properties :使用 方法调用语法 调用的普通get-procedures实现相同。但设定值是不同的;为此需要一个特殊的setter语法:

  1. type
  2. Socket* = ref object of RootObj
  3. h: int # 由于缺少星号,无法从模块外部访问
  4.  
  5. proc `host=`*(s: var Socket, value: int) {.inline.} =
  6. ## setter of host address
  7. s.h = value
  8.  
  9. proc host*(s: Socket): int {.inline.} =
  10. ## getter of host address
  11. s.h
  12.  
  13. var s: Socket
  14. new s
  15. s.host = 34 # same as `host=`(s, 34)

(该示例还显示了 inline 程序。)

可以重载 [] 数组访问运算符来提供 数组属性 :

  1. type
  2. Vector* = object
  3. x, y, z: float
  4.  
  5. proc `[]=`* (v: var Vector, i: int, value: float) =
  6. # setter
  7. case i
  8. of 0: v.x = value
  9. of 1: v.y = value
  10. of 2: v.z = value
  11. else: assert(false)
  12.  
  13. proc `[]`* (v: Vector, i: int): float =
  14. # getter
  15. case i
  16. of 0: result = v.x
  17. of 1: result = v.y
  18. of 2: result = v.z
  19. else: assert(false)

这个例子可以更好的用元组展示,元组提供 v[] 访问。