Nim语言中自定义setter proc未被调用问题排查
Nim中自定义ref对象setter未被调用的原因及解决方法
你的问题出在setter proc的参数类型定义上:
- 你定义的
age=proc接收的是var Animal类型参数,这表示该proc是用来修改引用变量本身(比如让a指向另一个Animal实例),而非修改引用指向的对象的字段。 - 当执行
a.age = 10时,编译器会直接解析为对引用底层对象的age字段赋值(等价于a[].age = 10),不会触发你定义的setter。
解决方法很简单,只需将setter的第一个参数改为Animal(无需var修饰,因为ref类型本身就是引用,修改其内部字段不需要额外的var):
type Animal = ref object of RootObj name: string age: int proc `age=`(a: Animal, value: int) {.inline.} = echo("setting age!") a.age = value var a: Animal new a a.age = 10 # 此时会调用自定义setter,输出"setting age!"
这样修改后,a.age = 10会被编译器正确解析为调用你定义的age= proc,从而触发自定义逻辑。
内容的提问来源于stack exchange,提问作者Alexandre Daubricourt
相关产品推荐
相关产品推荐

