reflection - `is` 所持有的底层类型是否有 `TAny` 功能?

标签 reflection nim-lang

我可以使用 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/

相关文章:

java - 是否可以通过 Play!模板作为变量?

nim-lang - Nim 和内存管理

compiler-errors - 使用 --os :any 编译 Nim 文件时出错

go - 如何启用 Python 以外的任何语言?

php - 获取扩展类的类的 PHP 类名?

c# - 编译日期和时间

nim-lang - Nim 中的字符串枚举类型?

audio - 如何在nim中播放WAV文件?

C# 反射——加载外部 DLL 和所有依赖项

c#使用反射从派生类中获取私有(private)成员变量