Nim:如何迭代切片?

blu*_*e10 6 iterator for-loop nim-lang

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

for i in 5..10:
  echo i
Run Code Online (Sandbox Code Playgroud)

但是只要我将切片存储在一个变量中,我就不能再迭代它,即失败:

var slice = 5..10
for i in slice:
  echo i
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么它在第一种情况下根本起作用?
  • 在第二种情况下是否有一种解决方法来迭代切片?

def*_*ef- 8

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

var slice = 5..10你调用proc ..(doc),生成一个Slice(a: 5, b: 10).但切片没有items定义默认迭代器.

你可以迭代slice.aslice.b,像这样:

var slice = 5..10
for i in slice.a .. slice.b:
  echo i
Run Code Online (Sandbox Code Playgroud)

由于这不是很好,正确的解决方案是定义自己的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
Run Code Online (Sandbox Code Playgroud)

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