属性

Nim不需要 get-properties :使用 方法调用语法 调用的普通get-procedure达到相同目的。 但设定值是不同的;为此需要一个特殊的setter语法:

  1. # 模块asocket
  2. type
  3. Socket* = ref object of RootObj
  4. host: int # 无法从模块外部访问
  5.  
  6. proc `host=`*(s: var Socket, value: int) {.inline.} =
  7. ## hostAddr的setter.
  8. ##它访问'host'字段并且不是对 ``host =`` 的递归调用,如果内置的点访问方法可用,则首选点访问:
  9. s.host = value
  10.  
  11. proc host*(s: Socket): int {.inline.} =
  12. ## hostAddr的getter
  13. ##它访问'host'字段并且不是对 ``host`` 的递归调用,如果内置的点访问方法可用,则首选点访问:
  14. s.host
  1. # 模块 B
  2. import asocket
  3. var s: Socket
  4. new s
  5. s.host = 34 # 同`host=`(s, 34)

定义为 f= 的proc(尾随 = )被称为 setter 。

可以通过常见的反引号表示法显式调用setter:

  1. proc `f=`(x: MyObject; value: string) =
  2. discard
  3.  
  4. `f=`(myObject, "value")

f= 可以在模式 xf = value 中隐式调用,当且仅当 x 的类型没有名为 f 的字段或者 f 时在当前模块中不可见。 这些规则确保对象字段和访问者可以具有相同的名称。 在模块 x.f 中总是被解释为字段访问,在模块外部它被解释为访问器proc调用。