You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:30:58