为什么通用类型无法推断?

时间:2015-01-21 01:20:07

标签: generics nim

我刚刚开始使用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'

有人可以提供任何见解,说明为什么会这样做以及如何正确地做到这一点?

1 个答案:

答案 0 :(得分:4)

不确定内部原因是什么,但Nim中的类型推断对于此可能过于局部。我认为通过编写Foo代替Foo[T]来明确说明proc test2[T](f: Foo[T], n: int): seq[T] = 的实例化是一种好的风格,如下所示:

{{1}}