Nim:如何迭代切片?

时间:2015-04-03 08:22:05

标签: for-loop iterator nim

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

for i in 5..10:
  echo i

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

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

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

  • 为什么在第一种情况下它完全有效?
  • 在第二种情况下是否有解决方法来迭代切片?

1 个答案:

答案 0 :(得分: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.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