【问题标题】:Graceful way of stopping at the end of an enumerator?在枚举数末尾停止的优雅方式?
【发布时间】:2012-11-04 17:39:52
【问题描述】:

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

例如,

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

【问题讨论】:

  • 请编辑您的问题并解释您的实际问题是什么。您也许可以使用each_cons(2),但细节太少,无法确定。

标签: ruby loops enumerators


【解决方案1】:

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

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

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

【讨论】:

  • 是的,这正是我想要使用的行为。因为(至少在我的脑海中)我的问题是关于 StopIteration 的,所以我正在回答上述海报,但感谢您的帖子。
【解决方案2】:

StopIteration 中营救是的方法。也是唯一的方法。*

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

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

【讨论】:

  • 谢谢,这是有道理的。从性能的角度来看,这是否意味着这 [上述建议的方式] 是一种不受欢迎的迭代方式?例如,tadman 的解决方案是否效率更高?
  • @wrhall 它们可能并没有太大的不同,但您始终可以自己运行基准测试来查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
相关资源
最近更新 更多