Nim:如何遍历切片?

Nim: How to iterate over a slice?

我对以下观察感到困惑。一方面,这有效:

for i in 5..10:
  echo i

但是一旦我将切片存储在一个变量中,我就无法再对其进行迭代,即,这失败了:

var slice = 5..10
for i in slice:
  echo i

错误是 type mismatch: got (Slice[system.int]),显然 Slice[T]system.items 迭代器没有重载签名。这就提出了问题:

使用 for i in 5..10: 调用迭代器 .. (doc),它只是 countup 的别名。由于这是一个内联迭代器,它将 for 循环转换为值 5 到 10 的 while 循环。但是除了闭包迭代器之外,内联迭代器不能分配给变量。

使用 var slice = 5..10 调用过程 .. (doc),它会生成 Slice(a: 5, b: 10)。但是 Slices 没有定义默认的 items 迭代器。

您可以从 slice.a 迭代到 slice.b,如下所示:

var slice = 5..10
for i in slice.a .. slice.b:
  echo i

因为这不是很好,正确的解决方案是定义你自己的 items 迭代器,像这样:

iterator items*[T](s: Slice[T]): T =
  for i in s.a .. s.b:
    yield i

var slice = 5..10
for i in slice:
  echo i

因为这对我来说似乎很合理,所以我提出了一个请求将其包含在系统模块中:https://github.com/nim-lang/Nim/pull/2449