2

我可以在运行时使用访问对象的字段,TAny并且我知道有.kind,这会给我正确的TAnyKind,但是有没有一种方法可以让我像is运算符一样查询特定的用户定义类型或概念?

喜欢...

my_any is FooObject

或者...

my_any is BarConcept

或者还有什么比TAny在这种情况下更好用的东西吗?

4

1 回答 1

3

惯用的 Nim 方法是依赖多态类型,例如ref RootObjorptr RootObj并使用 theof operator来执行类型检查。它简要记录在手册的对象和元组类型部分。

如果你真的需要使用TAny,目前没有支持的方式来做你想做的事,但是你可以将以下过程添加到 typeinfo.nim,它是系统模块的一部分:

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

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

于 2015-07-12T11:08:22.550 回答