6

seq私は約1日Nimを試してきましたが、操作するプロシージャがseqカスタムタイプも処理できるように、タイプをビルトインから継承する方法を知りたいと思っていました。

TestCol以下に、 a がシーケンスをラップ/プロキシする最小限の例を含めました。手順を再定義せずに、 などを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)

できれば、解決策として、パフォーマンス上の理由からカスタム シーケンスを通常のシーケンスに変換する必要はありません。変換は上記よりも簡単ではありません (def- で提案されているように、今のところはそのようにします)。

実際の使用例は、 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 に答える