【问题标题】:Nim: How to iterate over a slice?Nim:如何迭代切片?
【发布时间】:2015-06-08 08:06:28
【问题描述】:

我对以下观察感到困惑。一方面,这是可行的:

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-loop iterator nim-lang


    【解决方案1】:

    使用for i in 5..10: 调用迭代器.. (doc),它只是countup 的别名。由于这是一个内联迭代器,它将 for 循环转换为值 5 到 10 的 while 循环。但内联迭代器不能分配给变量,除了闭包迭代器。

    使用var slice = 5..10 调用过程.. (doc),它会生成Slice(a: 5, b: 10)。但是 Slice 没有定义默认的 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

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2023-01-08
      • 2010-11-23
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多