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].这引出了一些问题:
随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
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
| 归档时间: |
|
| 查看次数: |
924 次 |
| 最近记录: |