【问题标题】:Return sequence of generic type from parent class从父类返回泛型类型的序列
【发布时间】:2015-01-24 04:24:44
【问题描述】:

在下面的示例中,我有一个 Foo 对象,它有一个通用的 T 和一个 foo 类型为 T 的字段。

Foo 是可继承的,并且有一个名为 test 的过程,它应该创建并返回由子类定义的 T 类型的序列。

在我的代码的最新版本中,test proc 的第一行有错误:

无法实例化:'T'


如果我去掉 S 类型并将其替换为 FooP,错误就会消失,但随后我在 discard b.test() 行上收到错误:

类型不匹配:得到 (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() 在这种情况下如何成功返回子类定义的T 类型的序列吗?

【问题讨论】:

    标签: class generics nim-lang


    【解决方案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()
    

    【讨论】:

    • 再次感谢,这完全解决了它。很高兴知道这只是一个错误。它让我在圈子里跑了好几个小时! :-)
    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    相关资源
    最近更新 更多