是否有一种优雅的方式来实现一个人在调查员的最后?
例如,
a = (1..10).to_a
e = a.each
e.next # should yield 1
while e.next
# do something
end
当然,提高StopIteration 当你到达调查员的末尾时。
有没有一种很好的方法可以在没有救援的情况下突破循环? 我知道我可以说e.each(或者根本就不使用枚举器),但是对于我的具体问题,我想在前几次迭代中做一些特别的事情,然后在最后几次迭代中做一些事情。
我想要一种查看下一个值并获取nil
而不是错误的方法。
任何提示?可能有一些我很想念的东西......
NB。我不必使用枚举器,但它似乎是解决我的问题的最简单方法。因此,如果您有一个非枚举器解决方案(用于迭代可枚举),请随意共享。 (就此而言,也许我应该只使用each或each_with_index并使用计数器来处理特殊情况......)
答案 0 :(得分:4)
从StopIteration
拯救 方式来执行此操作。唯一的方法。*
当您意识到nil
返回的任何值(例如next
)可能是枚举的下一个值时,很明显它不是它可能返回一个特殊情况值,因为那时它永远不会在可枚举中。这就是为什么next
必须在完成时提升StopIteration
而不是做更“优雅”的事情。
* 假设您必须使用Enumerator
,因为可能有更好的方法来解决您的实际问题。
答案 1 :(得分:1)
使用each_with_index
有什么问题,就像你建议对前N有特殊行为?这种模式一直出现:
a.each_with_index do |e, i|
if (i <= n)
# Do special stuff
end
# Do regular stuff
end
您可以使用Enumerable工具箱中的许多工具。