Nim:如何遍历切片?
Nim: How to iterate over a slice?
我对以下观察感到困惑。一方面,这有效:
for i in 5..10:
echo i
但是一旦我将切片存储在一个变量中,我就无法再对其进行迭代,即,这失败了:
var slice = 5..10
for i in slice:
echo i
错误是 type mismatch: got (Slice[system.int])
,显然 Slice[T]
的 system.items
迭代器没有重载签名。这就提出了问题:
- 为什么第一种情况完全有效?
- 在第二种情况下是否有迭代切片的解决方法?
使用 for i in 5..10:
调用迭代器 ..
(doc),它只是 countup 的别名。由于这是一个内联迭代器,它将 for 循环转换为值 5 到 10 的 while 循环。但是除了闭包迭代器之外,内联迭代器不能分配给变量。
使用 var slice = 5..10
调用过程 ..
(doc),它会生成 Slice(a: 5, b: 10)
。但是 Slices 没有定义默认的 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
我对以下观察感到困惑。一方面,这有效:
for i in 5..10:
echo i
但是一旦我将切片存储在一个变量中,我就无法再对其进行迭代,即,这失败了:
var slice = 5..10
for i in slice:
echo i
错误是 type mismatch: got (Slice[system.int])
,显然 Slice[T]
的 system.items
迭代器没有重载签名。这就提出了问题:
- 为什么第一种情况完全有效?
- 在第二种情况下是否有迭代切片的解决方法?
使用 for i in 5..10:
调用迭代器 ..
(doc),它只是 countup 的别名。由于这是一个内联迭代器,它将 for 循环转换为值 5 到 10 的 while 循环。但是除了闭包迭代器之外,内联迭代器不能分配给变量。
使用 var slice = 5..10
调用过程 ..
(doc),它会生成 Slice(a: 5, b: 10)
。但是 Slices 没有定义默认的 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