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
之前的谓词