2015-01-21 71 views
2

我剛剛開始使用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) 

然而,如果不是我想返回來自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) 

然後我得到了以下錯誤:

Error: cannot instantiate: 'T'

任何人都可以請提供任何洞察力,這是爲什麼,以及如何正確地做到這一點?

回答

4

不確定這是什麼內部原因,但在Nim中的類型推斷可能太局部。我認爲這是良好的作風,以明確規定的Foo的實例反正寫Foo[T]代替,就像這樣:

proc test2[T](f: Foo[T], n: int): seq[T] = 
+0

是的,這似乎照顧它。謝謝! – 2015-01-21 01:47:33