`TAny` 持有的底层类型是否有`is` 功能?
Is there `is` functionality for the underlying types held by `TAny`?
我可以在运行时使用 TAny
访问对象的字段,我知道有 .kind
,这会给我正确的 TAnyKind
但是有没有一种方法可以让我像 is
运算符那样查询特定的用户定义类型或概念?
喜欢...
my_any is FooObject
或...
my_any is BarConcept
在这种情况下,还有什么比 TAny
更好用的东西吗?
惯用的 Nim 方法是依赖多态类型,例如 ref RootObj
或 ptr RootObj
,并使用 of operator
来执行类型检查。它在手册的 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
这里有一个使用 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
概念的类型检查是一种严格的编译时机制,它没有 运行 时间等效项。
我可以在运行时使用 TAny
访问对象的字段,我知道有 .kind
,这会给我正确的 TAnyKind
但是有没有一种方法可以让我像 is
运算符那样查询特定的用户定义类型或概念?
喜欢...
my_any is FooObject
或...
my_any is BarConcept
在这种情况下,还有什么比 TAny
更好用的东西吗?
惯用的 Nim 方法是依赖多态类型,例如 ref RootObj
或 ptr RootObj
,并使用 of operator
来执行类型检查。它在手册的 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
这里有一个使用 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
概念的类型检查是一种严格的编译时机制,它没有 运行 时间等效项。