1

有没有一种优雅的方式来实现一个枚举数的末尾?

例如,

a = (1..10).to_a
e = a.each
e.next # should yield 1
while e.next
  # do something
end

当然, 当您到达枚举数末尾时,e 会引发StopIteration 。

有没有一种很好的方法可以在没有救援的情况下打破这个 while 循环?我知道我可以只说 e.each (或者根本不使用枚举器),但是对于我的具体问题,我想在前几次迭代中做一些特别的事情,然后在最后几个迭代中做一些一般性的事情。

我想要一种查看下一个值并获取nil而不是错误的方法。

有小费吗?可能有一些明显的东西我错过了......

注意。我不必使用枚举器,但这似乎是解决我的问题的最简单方法。因此,如果您有一个非枚举器解决方案(用于迭代可枚举),请随时分享。(在那张纸条上,也许我应该只使用 each 或 each_with_index 并将计数器用于特殊情况......)

4

2 回答 2

4

解救StopIteration一种方法。唯一的办法。*

当您意识到返回的任何值(例如nil,如您所建议的那样)next可能是可枚举的下一个值时,很明显它不可能返回特殊情况的值,因为那永远不会在可枚举中. 这就是为什么next必须在完成时加注StopIteration而不是做一些更“优雅”的事情。

*假设您必须使用Enumerator,因为可能有更好的方法来解决您的实际问题而无需这样做。

于 2012-11-16T01:47:14.720 回答
1

像你建议的那样使用each_with_index对第一个 N 有特殊行为有什么问题?这种模式一直出现:

a.each_with_index do |e, i|
  if (i <= n)
    # Do special stuff
  end
  # Do regular stuff
end

Enumerable工具箱中有很多工具可供您使用。

于 2012-11-16T04:28:20.910 回答