在调查员结束时停止的优雅方式?

时间:2012-11-16 01:30:52

标签: ruby loops enumerators

是否有一种优雅的方式来实现一个人在调查员的最后?

例如,

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并使用计数器来处理特殊情况......)

2 个答案:

答案 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工具箱中的许多工具。