首页 > 解决方案 > Nim 中的 any 类型的混淆问题

问题描述

我有一个类型:

type
  generic_seq[T] = ref object
    data: T
    case base: bool
    of false: down: generic_seq[any]
    of true: discard

和以下代码行:

var current_args: generic_seq[int] = generic_seq[int](base: true.bool, data: 3)

和编译器行:nim c -r main给出错误:Error: invalid type: 'auto' in this context: 'generic_seq[system.int]' for var

但是,我看不到任何类型会导致类型混淆问题的位置。generic_seq 对象已经是原始版本的 hackier“更安全”版本:

type
  generic_seq[T] = ref object
    data: T
    down: generic_seq[any]

generic_seq[int](data: 3, down: nil)当以相同的方式传递参数时,它也失败了。我看不出非具体类型在哪里暴露有任何歧义。我错过了什么?这可能是一个糟糕的编译器实现吗?

标签: genericsnim-lang

解决方案


我认为你的困惑源于试图用泛型来做到这一点。如果我做对了,您要做的是声明一个可以是任何类型的对象的单链表。此外,您不想在编译时声明此类型。这意味着你必须使用 RTTI,使用 Nim 的 typeinfo 模块。请注意,不建议使用 typeinfo 模块,因为它有很多陷阱,即关于对象的生命周期。

这是使用 typeinfo 的通用序列:

import typeinfo

type
  genSeq = ref object
    data: Any
    down: genSeq

var intDatum = 3
var strDatum = "hello, world!"
let child = genSeq(data: strDatum.toAny, down:nil)
let a = genSeq(data: intDatum.toAny, down: child)
echo a.data.getInt    # echos 3
echo a.down.data.getString # echos "hello, world!"

但是,这可能不是您想要的,因为 RTTI 通常很昂贵。如果您要使用的对象集有限,您可以使用 case 表达式来获得相同的结果,而不受 RTTI 的限制。

对于未来的问题,您还可以交叉发布到 nim 论坛:forum.nim-lang.org以获得更快的回复。


推荐阅读