继承Nim中的序列

meg*_*wac 6 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: 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)
Run Code Online (Sandbox Code Playgroud)

优选地,出于性能原因,解决方案不需要将自定义序列转换为常规序列,而变换不如上面那么简单(尽管这是我现在要做的,如建议的那样)

真实世界的用例是在RingBuffer.nim上实现数组助手

def*_*ef- 4

隐式转换器是解决这个问题的一种方法:

converter toSeq*[T](x: TestCol[T]): seq[T] =
  x.data
Run Code Online (Sandbox Code Playgroud)

不幸的是,当调用需要 openarray 的过程时,它们不会被调用。我报告了一个关于此的错误,但我不确定它是否可以更改/修复: https: //github.com/nim-lang/Nim/issues/2652