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上实现数组助手
隐式转换器是解决这个问题的一种方法:
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