2

我刚刚开始使用 Nim,并且遇到了泛型问题。

这是一个简化的示例,可以复制我遇到的问题。从具有泛型类型的简单对象类型开始T,并创建它的实例:

type Foo[T] = object
    bar: T

var my_foo = Foo[string](bar: "foobar")

如果我proc用泛型类型创建 a ,然后返回对象的字段,它T的返回值是type ,它工作正常:TbarT

# This works!
proc test[T](f: Foo, n: int): T = 
    f.bar

echo test(my_foo, 1)

但是,如果我想返回T来自Foo.bartype 字段的多个副本的序列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'

任何人都可以提供任何关于为什么会这样以及如何正确地做到这一点的见解吗?

4

1 回答 1

4

不确定这是什么内部原因,但 Nim 中的类型推断可能过于本地化。我认为Foo通过编写来明确说明无论如何的实例化是一种很好的风格Foo[T],如下所示:

proc test2[T](f: Foo[T], n: int): seq[T] =
于 2015-01-21T01:30:54.210 回答