给定一个通用对象`ref`,我可以发现它引用的对象的类型吗?

时间:2018-04-07 10:59:01

标签: nim

鉴于(比方说)ref RootObj,我可以发现它所引用的对象的类型吗? (我对typetraits等的实验没有成功......)

例如,鉴于此:

import typetraits, typeinfo, system

type
  TypeA = object of RootObj
    field: int

var
  a : ref RootObj = TypeA.new # an instance of TypeA on the heap

我可以获得a的基础类型吗? repr似乎知道,但system.type没有。

echo repr a      # output: ref 0x7f73e856c048 --> [field = 0]
echo a.type.name # output: ref RootObj

typeinfo模块似乎没有解决这个问题 - 它只处理原始类型,因此可以识别对象(akObject),但不能识别对象的类型。

我怀疑还有另一种方式,但它是什么?

1 个答案:

答案 0 :(得分:1)

目前,没有通用的方法来获取运行时ref对象的类型名称。这种功能需要将类型名称打包到二进制文件中,增加其大小,在大多数情况下从不使用此信息。

因此,如果你真的需要某种运行时反射,你必须自己实现它。

但是,有一个-d:nimTypeNames标志,可以将类型名称添加到二进制文件中,以进行GC调试。 repr可以重复使用该信息,并且应该易于实现,因此非常值得提供功能。请注意,这只能用于调试目的。