Return 来自父 class 的泛型序列
Return sequence of generic type from parent class
在下面的例子中,我有一个 Foo
对象,它有一个泛型 T
和一个 foo
类型的 T
字段。
Foo
是可继承的,并且有一个名为 test
的过程应该创建和 return 一个由子类定义的 T
类型的序列。
在我的最新版本的代码中,test
proc 的第一行有一个错误:
cannot instantiate: 'T'
如果我摆脱 S
类型并将其替换为 FooP
,错误消失,但随后我在 discard b.test()
行上收到错误:
type mismatch: got (BarP)
代码如下:
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()
在这种情况下如何成功 return 子类定义的 T
类型的序列吗?
泛型继承无效是一个已知错误: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()
在下面的例子中,我有一个 Foo
对象,它有一个泛型 T
和一个 foo
类型的 T
字段。
Foo
是可继承的,并且有一个名为 test
的过程应该创建和 return 一个由子类定义的 T
类型的序列。
在我的最新版本的代码中,test
proc 的第一行有一个错误:
cannot instantiate: 'T'
如果我摆脱 S
类型并将其替换为 FooP
,错误消失,但随后我在 discard b.test()
行上收到错误:
type mismatch: got (BarP)
代码如下:
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()
在这种情况下如何成功 return 子类定义的 T
类型的序列吗?
泛型继承无效是一个已知错误: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()