generics - 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)
当以相同的方式传递参数时,它也失败了。我看不出非具体类型在哪里暴露有任何歧义。我错过了什么?这可能是一个糟糕的编译器实现吗?
解决方案
我认为你的困惑源于试图用泛型来做到这一点。如果我做对了,您要做的是声明一个可以是任何类型的对象的单链表。此外,您不想在编译时声明此类型。这意味着你必须使用 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以获得更快的回复。
推荐阅读
- ios - Mac 能识别 iPhone,Xcode 不能
- html - Twitter 时间线未加载
- firebase - 我可以使用 StreamBuilder 在 Firestore 中收听单个文档吗?
- r - data.table 中的 ifelse 函数不会产生正确的值
- firebase - 我可以根据不在数组中的值进行查询吗?
- c# - 如何使用服务器端代码从 http post header 获取表单数据
- c# - 如何根据.net中的字符拆分将数据表行拆分为多行
- css - Ng bootstrap modal在以角度关闭一个模态弹出窗口后没有弹出
- php - 删除 SQL 表列名中的一个字母会破坏我的 PHP 页面。为什么?
- java - 在数字迷宫中找到最短路径,Java