首页 > 解决方案 > Nim 中的迭代器生成函数:分配迭代器时工作,直接调用时卡住

问题描述

我试图制作一个创建迭代器的过程,如下所示:

proc makeCDFrom(start: int): iterator(): int =
  result = iterator(): int =
    var
      i: int = start
    while i >= 0:
      echo "i:", i
      yield(i)
      dec(i)

let cdFrom6 = makeCDFrom(6)
for j in cdFrom6():
  echo "j:", j

这似乎按预期工作:

i:6
j:6
i:5
j:5
i:4
j:4
i:3
j:3
i:2
j:2
i:1
j:1
i:0
j:0

但是,最初,我尝试了这种细微的变化:

proc makeCDFrom(start: int): iterator(): int =
  result = iterator(): int =
    var
      i: int = start
    while i >= 0:
      echo "i:", i
      yield(i)
      dec(i)

# Note the direct call:
for j in makeCDFrom(6)():
  echo "j:", j

当我尝试在https://play.nim-lang.org/上运行上述内容时,它似乎被卡住了。什么都没有显示。

为什么会有这种差异?

标签: while-loopiteratornim-lang

解决方案


为什么?

因为有bug。

你能为这个做什么?

向 github.com/nim-lang/Nim 报告错误

同时使用

let myClosureIter = makeCDFrom(6)

或在没有工厂的情况下定义您的迭代器:

iterator makeCDFrom(start: int): int =
    var
      i: int = start
    while i >= 0:
      echo "i:", i
      yield(i)
      dec(i)

# Note the direct call:
for j in makeCDFrom(6):
  echo "j:", j

推荐阅读