我已经在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)
最好,由于性能原因,该解决方案将不需要将自定义序列转换为规则序列,而转换比上面的转换要琐碎(尽管这是我现在所建议的那样)
现实情况是在RingBuffer.nim上实现数组助手
最佳答案
隐式转换器将是解决此问题的一种方法:
converter toSeq*[T](x: TestCol[T]): seq[T] =
x.data
不幸的是,它们在调用需要openarray的proc时不会被调用。我报告了一个与此有关的错误,但不确定是否可以更改/修复:https://github.com/nim-lang/Nim/issues/2652