如何获取Nim中ref类型引用的实际对象类型?
在Nim中获取ref RootObj变量的实际底层类型
你遇到的这个问题太典型了——当把子类实例赋值给父类的ref变量时,静态类型系统只会识别到ref RootObj,但我们需要拿到它实际指向的对象类型对吧?你试了typetraits没成功,其实是没用到正确的工具。
其实Nim的typeinfo模块里的getType函数就是干这个的,它能获取对象的动态类型,而不是编译时的静态类型。你说repr能识别出实际类型,也是因为它内部调用了类似的动态类型检测逻辑。
给你改一下示例代码,直接就能拿到真实类型:
import typetraits, typeinfo, system type TypeA = object of RootObj field: int var a : ref RootObj = TypeA.new # 堆上的TypeA实例 # 关键:先解引用ref变量,再获取动态类型 let dynamicType = getType(a[]) echo dynamicType.name # 输出: TypeA echo dynamicType.fullName # 输出: TypeA
这里要注意,必须用a[]解引用ref变量,拿到堆上的实际对象实例,再传给getType。如果直接传a,拿到的还是ref RootObj的类型,这也是你之前用.type没成功的原因——.type只能获取变量的静态类型。
另外如果你的ref变量可能为nil,记得先做非空判断,避免运行时崩溃:
if a != nil: let dynamicType = getType(a[]) echo dynamicType.name else: echo "变量是nil,无法获取实际类型"
内容的提问来源于stack exchange,提问作者wu-lee
相关产品推荐
相关产品推荐

