gpt4 book ai didi

Ruby 枚举器 - 为什么异常结束?

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:20 25 4
gpt4 key购买 nike

在 Ruby 中迭代一个 block 非常简单 - 它干净地完成并继续执行其余代码。

另一方面,使用枚举器进行迭代有点令人困惑。如果您在没有 block 的情况下调用 :each,则会返回一个 Enumerator。然后可以在 Enumerator 上调用 :next 以获取每个下一个迭代值。

然后是奇怪的部分——当迭代完成时,枚举器没有返回 nil,而是抛出一个异常:“迭代到达末尾”。结果是它甚至没有返回值。

例如:

test = [ 'test_value' ]
enumerator = test.each
enumerator.next
>> "test_value"
enumerator.next
>> StopIteration: iteration reached at end

这样做的原因仅仅是为了枚举器可以返回 nil 值吗?答案只有在我发布这个时才会出现(所以我仍然要发布它),但似乎一定是这样。

如果是这样,这是处理此类问题的典型方式吗?使用异常来处理本质上按预期执行的代码似乎很奇怪。

最佳答案

你是对的,原因是 nil 可以作为枚举器的有效值返回。为了回答您关于这是否典型的问题,Python 使用也称为 StopIteration 的异常以相同的方式处理它。

>>> my_list = [1,2,3]
>>> i = iter(my_list)
>>> i.next()
1
>>> i.next()
2
>>> i.next()
3
>>> i.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

当然,大多数时候 next 不会被直接调用(eachfor 循环被使用)所以这个底层机制并不经常公开。

关于Ruby 枚举器 - 为什么异常结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3212533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com