Ruby 是否有一种内置的方法来检查“next”或“peek”是否会引发StopIteration?

Ruby 是否有一种内置的方法来检查“next”或“peek”是否会引发StopIteration?,ruby,enumerator,Ruby,Enumerator,我正在使用一些迭代器,在这些迭代器中我必须做一些事情(enum是一个枚举器) enums_with_zero您可以显式地rescueStopIteration,但也有这样一种想法,loop方法通过简单地退出循环,在内部拯救StopIteration异常。(在循环内,提升停止迭代与中断具有相同的效果) 当您试图越过终点偷看时,此代码仅退出循环: a = %w(a b c d e).to_enum loop do print a.peek a.next end 代码输出abcde。(它还

我正在使用一些迭代器,在这些迭代器中我必须做一些事情(
enum
是一个枚举器)


enums_with_zero您可以显式地
rescue
StopIteration
,但也有这样一种想法,
loop
方法通过简单地退出循环,在内部拯救
StopIteration
异常。(在
循环内
提升停止迭代
中断
具有相同的效果)

当您试图越过终点偷看时,此代码仅退出循环:

a = %w(a b c d e).to_enum

loop do
  print a.peek
  a.next
end
代码输出
abcde
。(它还透明地引发和拯救
StopIteration

因此,如果您想在尝试查看结束时忽略
StopIteration
异常,只需使用
loop

当然,一旦你偷看到尽头,你就会被甩出圈外。如果您不想这样做,可以使用
while
rescue
自定义行为。例如,如果要避免在偷看结束时退出,并在使用
next
迭代结束时退出,可以执行以下操作:

a = %w(a b c d e).to_enum

while true
  begin  
    print a.peek
  rescue StopIteration
    print "\nTried to peek past the end of the enum.\nWe're gonna overlook that.\n"
  end
  x = a.next rescue $!
  break if x.class == StopIteration
end

p 'All done!'
循环中的最后两行执行与此相同的操作,您可以使用它:

begin
  a.next
rescue StopIteration
  break
end
需要指出的一点是,处理
StopIteration
是Ruby处理到达迭代器末尾的预期方式。引用Matz的书《Ruby编程语言》:

外部迭代器的使用非常简单:每次需要另一个迭代器时,只需调用
next
元素。当没有剩余的元素时,
next
将引发
StopIteration
异常。 这似乎很不寻常,因为预期终止会引发例外情况 条件,而不是意外和异常事件。(
StopIteration
是一个后代 属于
标准错误
索引器
;请注意,它是唯一的例外之一 类的名称中没有“error”一词。)Ruby在这方面遵循Python 外部迭代技术。通过将循环终止视为异常,它使 你的循环逻辑非常简单;不需要检查的返回值
next
获取一个特殊的迭代结束值,无需调用某种类型的
next?
调用
next
之前的谓词