Inheritance 从Nim中的序列继承

Inheritance 从Nim中的序列继承,inheritance,typeclass,nim-lang,Inheritance,Typeclass,Nim Lang,我已经用Nim做了大约一天的实验,我想知道如何让一个类型继承一个内置的(seq),这样在seq上操作的过程也可以处理自定义类型 我在下面列出了一个最小的例子,其中一个TestCol包装/代理一个序列-有没有一种方法可以在不重新定义过程的情况下让TestCol支持map,filter等 type TestCol*[T] = object data*: seq[T] proc len*(b: TestCol): int = b.data.len proc `[]`*[T](b: Te

我已经用Nim做了大约一天的实验,我想知道如何让一个类型继承一个内置的(
seq
),这样在
seq
上操作的过程也可以处理自定义类型

我在下面列出了一个最小的例子,其中一个
TestCol
包装/代理一个序列-有没有一种方法可以在不重新定义过程的情况下让
TestCol
支持
map
filter

type
  TestCol*[T] = object
    data*: seq[T]

proc len*(b: TestCol): int = b.data.len

proc `[]`*[T](b: TestCol[T], idx: int): T =
  b.data[idx]

proc `[]=`*[T](b: var TestCol[T], idx: int, item: T) =
  b.data[idx] = item

var x = newSeq[int](3)
var y = TestCol[int](data: x)

y[0] = 1
y[1] = 2
y[2] = 3

for n in map(y, proc (x: int): int = x + 1):
  echo($n)
由于性能原因,该解决方案最好不需要将自定义序列转换为常规序列,因为转换比上面提到的要简单(尽管这是我现在按照def建议所做的)


真实世界的用例是在

上实现数组帮助程序隐式转换器将是解决此问题的一种方法:

converter toSeq*[T](x: TestCol[T]): seq[T] =
  x.data

不幸的是,当调用需要openarray的proc时,它们不会被调用。我报告了一个关于这个的bug,但我不确定它是否可以更改/修复:

转换器是否可以成为迭代器/生成器——例如,如果您想要实现
binarySearch
,并且序列是一个不太直接的代理(在我的例子中是循环缓冲区)