我可以使用 TAny
在运行时访问对象的字段,并且我知道有 .kind
,它将为我提供正确的 TAnyKind
> 但是有没有一种方法可以让我像 is
运算符那样查询特定的用户定义类型或概念?
喜欢...
my_any is FooObject
或者...
my_any is BarConcept
或者在这种情况下还有其他比 TAny
更好的东西吗?
最佳答案
惯用的 Nim 方法是依赖多态类型,例如 ref RootObj 或 ptr RootObj 并使用 of 运算符来执行类型检查。它在 Object and Tuples Types 中有简要记录。手册中的部分。
如果您确实需要使用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
这是使用过程的示例:
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
概念的类型检查是一种严格的编译时机制,并且没有等效的运行时机制。
关于reflection - `is` 所持有的底层类型是否有 `TAny` 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31360176/