在Ruby中遍历其余的Enumerator

vvc*_*vch 4 ruby iterator for-loop enumerator

我在某些序列中间有一个枚举器:

enum = (1..9).each
first = enum.next
second = enum.next
Run Code Online (Sandbox Code Playgroud)

现在,我要遍历序列的其余部分(3..9个数字)。但是看似显而易见的解决方案(例如在python中工作)从序列的开头而不是第三项重新开始:

for item in enum
    puts item
end
# prints 1..9 instead of 3..9
Run Code Online (Sandbox Code Playgroud)

我发现工作解决方案似乎很丑陋:

begin
    while item=enum.next
        puts item
    end
rescue StopIteration
end
Run Code Online (Sandbox Code Playgroud)

那么问题来了:是否有更好的红宝石解决方案可以做到这一点?为什么for在Ruby 中循环如此行?

Tom*_*ord 6

为了直接回答您的问题,您当前的代码正确无误,但设计过度。您只需要做:

enum = (1..9).each
first = enum.next
second = enum.next

loop { puts enum.next }
Run Code Online (Sandbox Code Playgroud)

break枚举结束时,循环将立即结束;该loop自动救StopIteration你。仅当您在循环后enum.next 再次调用才会重新引发,此处不会发生。

但是,正如@mudasobwa指出的那样,使用像这样的枚举非常普遍;更常见的是(1..9).each_with_index通过索引使用并显式处理第一个收益。

  • 哇,确实,“救援”是多余的,谢谢,从不知道(这反过来意味着整个结构是愚蠢的,以至于我在5年以上的经验中都没有尝试过:) (3认同)