我对以下观察感到困惑。一方面,这有效:
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}}迭代器没有重载签名。这引出了一些问题:
答案 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