Nim中定义含过程字段的类型失败,报错‘CommandC非具体类型’
解决Nim编译错误:
'CommandC' is not a concrete type 错误原因
你定义CommandC对象时,tocall字段的proc参数直接引用了未完全定义的CommandC类型。Nim作为静态类型语言,要求proc的参数必须是具体类型(即完全定义完成的类型),但此时CommandC还处于不完整的定义状态,因此编译器报错。
两种解决方案
方案1:将CommandC改为引用类型(ref object)
引用类型在声明后立即成为具体类型,即使内部字段还未完全定义,编译器可以正常处理:
type CommandC = ref object tocall: proc (info: CommandC, vrs: SharedTable) arguments: seq[seq[string]] subcommands: seq[CommandC] CommandP = object cat: string tocall: proc (info: CommandC, vrs: SharedTable) arguments: seq[string] textdata: string
方案2:前置声明类型并使用指针(ptr)
先通过{.forward.}前置声明CommandC,然后用指针类型作为proc的参数,后续再完整定义对象:
type CommandC* {.forward.} CommandC = object tocall: proc (info: ptr CommandC, vrs: SharedTable) arguments: seq[seq[string]] subcommands: seq[CommandC] CommandP = object cat: string tocall: proc (info: ptr CommandC, vrs: SharedTable) arguments: seq[string] textdata: string
补充说明
从Python转Nim要注意:Python是动态类型语言,对类型完整性没有严格要求;但Nim是静态类型语言,类型必须完全定义后才能作为proc的参数、返回值等使用。引用/指针类型是处理这种递归类型依赖的常用方式。
内容的提问来源于stack exchange,提问作者user21096770
相关产品推荐
相关产品推荐

