我已经在Nim上进行了大约一天的实验,我想知道如何使类型从内置的(特别是seq)继承,以便在seq上操作的过程也可以处理自定义类型。

我在下面提供了一个最小示例,其中TestCol包装/代理一个序列-是否有一种方法可以使TestCol支持mapfilter等而无需重新定义过程?

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)


最好,由于性能原因,该解决方案将不需要将自定义序列转换为规则序列,而转换比上面的转换要琐碎(尽管这是我现在所建议的那样)

现实情况是在RingBuffer.nim上实现数组助手

最佳答案

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

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


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

08-06 12:53