我可以使用TAny
在运行时访问对象的字段,我知道那里有.kind
,它会给我正确的TAnyKind
但是有方法吗?这将让我查询特定的用户定义类型或概念,如is
运算符吗?
...一样
my_any is FooObject
...或
my_any is BarConcept
或者在这种情况下还有其他比TAny
更好的用途吗?
答案 0 :(得分:3)
惯用的Nim方式是依赖于ref RootObj
或ptr RootObj
等多态类型,并使用of operator
来执行类型检查。它简要记录在手册的Object and Tuples Types部分。
如果您确实需要使用TAny
,目前没有支持的方法可以执行您想要的操作,但您可以将以下proc添加到typeinfo.nim,它是系统模块的一部分:< / p>
proc isInstanceOf*(a: Any, T: typedesc): bool =
if a.rawType.kind != tyObject: return false
var tval: T
var targetType = cast[PNimType](tval.getTypeInfo)
var argType = a.rawType
while argType != targetType:
if argType == nil: return false
argType = argType.base
return true
以下是使用proc的示例:
import typeinfo
type
Foo = object of RootObj
x: int
FooDerived = object of Foo
y: int
Bar = object of RootObj
s: string
var obj = FooDerived(x: 1, y: 2)
var objAny = obj.toAny
echo objAny.isInstanceOf(Bar)
echo objAny.isInstanceOf(Foo)
echo objAny.isInstanceOf(FooDerived)
代码将打印:
false
true
true
概念的类型检查是一种严格的编译时机制,它没有运行时等价物。