在下面的示例中,我有一个Foo
对象,其中包含通用T
和foo
字段{。}}。
T
是可继承的,并且有一个名为Foo
的proc,它应该创建并返回由子类定义的类型test
的序列。
在我的代码的最新版本中,T
proc的第一行出现错误:
无法实例化:'T'
如果我删除test
类型并将其替换为S
,则错误会消失,但我会在FooP
行上收到错误消息:
类型不匹配:得到(BarP)
以下是代码:
discard b.test()
我确定我刚搞砸了。有人可以告诉我在这种情况下type
Foo[T] = object {.inheritable.}
foo:T
FooP[T] = ref Foo[T]
proc test[S, T](self: S): seq[T] =
var f: T = self.foo
var s: seq[T] = @[f]
s
type
Bar = object of Foo[int]
BarP = ref Bar
var b: BarP = new(Bar)
discard x.test()
如何成功返回由子类定义的test()
类型的序列?
答案 0 :(得分:1)
泛型不起作用的继承是一个已知错误:https://github.com/nim-lang/Nim/issues/88
您可以通过不指定类型来解决此问题,例如在test3中:
type
Foo[T] = object {.inheritable.}
foo: T
FooP[T] = ref Foo[T]
# Only works for Foo[T]
proc test[T](self: Foo[T]): seq[T] =
@[self.foo]
# Only works for ref Foo[T]
proc test2[T](self: FooP[T]): seq[T] =
@[self.foo]
# Workaround:
proc test3(self): auto =
@[self.foo]
type
Bar = object of Foo[int]
BarP = ref Bar
var a = new Foo[int]
var b: BarP = new(Bar)
var c: Bar
echo a.test3()
echo b.test3()
echo c.test3()