You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:26:06