是否存在`TAny`持有的基础类型的`is`功能?

时间:2015-07-11 18:01:10

标签: reflection nim

我可以使用TAny在运行时访问对象的字段,我知道那里有.kind,它会给我正确的TAnyKind但是有方法吗?这将让我查询特定的用户定义类型或概念,如is运算符吗?

...一样

my_any is FooObject

...或

my_any is BarConcept

或者在这种情况下还有其他比TAny更好的用途吗?

1 个答案:

答案 0 :(得分:3)

惯用的Nim方式是依赖于ref RootObjptr 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

概念的类型检查是一种严格的编译时机制,它没有运行时等价物。