我刚刚开始使用Nim,并且遇到了泛型问题。
这是一个复制我遇到的问题的简化示例。从具有泛型类型T
的简单对象类型开始,并创建它的实例:
type Foo[T] = object
bar: T
var my_foo = Foo[string](bar: "foobar")
如果我使用泛型类型proc
创建T
,返回值为T
,然后返回对象的bar
字段,则可以正常工作是类型T
:
# This works!
proc test[T](f: Foo, n: int): T =
f.bar
echo test(my_foo, 1)
但是,如果我想要返回T
来自Foo.bar
字段T
的多个副本序列,请执行以下操作:
# This fails!
proc test2[T](f: Foo, n: int): seq[T] =
var s: T = f.bar
var r: seq[T] = @[]
for x in 1..n:
r.add(s)
result = r
echo test2(my_foo, 3)
然后我收到以下错误:
错误:无法实例化:' T'
有人可以提供任何见解,说明为什么会这样做以及如何正确地做到这一点?
答案 0 :(得分:4)
不确定内部原因是什么,但Nim中的类型推断对于此可能过于局部。我认为通过编写Foo
代替Foo[T]
来明确说明proc test2[T](f: Foo[T], n: int): seq[T] =
的实例化是一种好的风格,如下所示:
{{1}}