如何从HashSet、复合类型及派生类型获取类型与祖先类型信息
在Nim中获取复合类型参数与类型的直接祖先类型
1. 获取泛型复合类型的参数类型(如BigTable的键/值类型)
对于Nim的泛型类型(比如Table),可以通过类型索引直接访问其泛型参数。以你的BigTable为例,typeof(table)会返回BigTable类型,而BigTable本质是Table[MyKeyType, MyValType]的别名,因此可以用[0]和[1]分别获取键类型和值类型:
type SomeEnum = enum Up, Down, Left, Right, Sideways MyKeyType = string MyValType = SomeEnum BigTable = Table[MyKeyType, MyValType] proc MyProc(table: BigTable) = # 获取BigTable的键类型(MyKeyType,即string) var innerKey: typeof(table)[0] # 获取BigTable的值类型(MyValType,即SomeEnum) var innerVal: typeof(table)[1] # 验证类型输出 echo typeof(innerKey) # 输出: MyKeyType echo typeof(innerVal) # 输出: MyValType
如果需要跳过类型别名,直接获取底层原始类型(比如从MyKeyType拿到string),可以使用内置的underlyingType操作符:
var innerKeyRaw: underlyingType(typeof(table)[0]) echo typeof(innerKeyRaw) # 输出: string
2. 获取类型的直接祖先/底层类型(如MyValType的直接祖先SomeEnum)
针对类型别名(如MyValType = SomeEnum),用underlyingType可以直接获取它的底层原始类型(也就是你要的直接祖先SomeEnum):
proc MyProc(table: BigTable) = var someThing: underlyingType(MyValType) echo typeof(someThing) # 输出: SomeEnum
如果是对象继承场景(比如派生对象的直接基类),则使用内置的baseType操作符:
type ParentObj = ref object ChildObj = ref object of ParentObj MyChildType = ChildObj proc TestInheritance() = var parentInst: baseType(MyChildType) echo typeof(parentInst) # 输出: ParentObj
内容的提问来源于stack exchange,提问作者Sonicsmooth
相关产品推荐
相关产品推荐

