属性

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

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

定义为 f= 的 proc(后面跟 \= )被称为 setter 。 可以通过常见的反引号表示法显式调用 setter:

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

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