6

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

我在下面包含了一个最小示例,其中 aTestCol包装/代理了一个序列 - 是否有一种方法可以在不重新定义过程的情况下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)

出于性能原因,该解决方案最好不需要将自定义序列转换为常规序列,并且转换比上面的简单(尽管这就是我现在按照定义建议做的事情)

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

4

1 回答 1

4

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

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

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

于 2015-05-04T17:38:56.140 回答