9

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

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迭代器的重载签名Slice[T]。这就提出了以下问题:

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

1 回答 1

10

随着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您可以从to迭代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

于 2015-04-03T09:07:10.127 回答