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()