在Ruby早期逃避.each {}迭代

时间:2009-10-14 18:56:38

标签: ruby loops iterator enumerator

代码:

 c = 0  
 items.each { |i|  
   puts i.to_s    
   # if c > 9 escape the each iteration early - and do not repeat  
   c++  
 }  

我想抓住前10个项目,然后离开“每个”循环。

我该用符号替换注释行?有更好的方法吗?更多Ruby惯用的东西?

8 个答案:

答案 0 :(得分:59)

虽然break解决方案有效,但我认为更实用的方法确实适合这个问题。您想要take前10个元素并打印出来,请尝试

items.take(10).each { |i| puts i.to_s }

答案 1 :(得分:45)

Ruby中没有++运算符。将doend用于多行块也是惯例。修改您的解决方案会产生:

c = 0  
items.each do |i|  
  puts i.to_s    
  break if c > 9
  c += 1 
end

或者:

items.each_with_index do |i, c|  
  puts i.to_s    
  break if c > 9
end

请参阅each_with_index以及Programming Ruby Break, Redo, and Next

带有范围的

更新: Chuck's answer更像Ruby,使用take的{​​{3}}更好。

答案 2 :(得分:7)

break适用于从循环中提早转义,但仅仅是items[0..9].each {|i| puts i}更为惯用。 (如果你所做的只是字面上打印完全没有变化的项目,你可以puts items[0..9]。)

答案 3 :(得分:4)

另一种变体:

puts items.first(10)

请注意,这适用于少于10个项目的数组:

>> nums = (1..5).to_a
=> [1, 2, 3, 4, 5]
>> puts nums.first(10)
1
2
3
4
5

(另一个注意事项,很多人提供某种形式的puts i.to_s,但在这种情况下,.to_s不是多余的?puts会自动调用.to_s我想,在非字符串上将其打印出来。如果你想说.to_s之类的话,你只需要puts 'A' + i.to_s。)

答案 4 :(得分:4)

另一种选择是

items.first(10).each do |i|
  puts i.to_s
end

对于我而言,这比读取迭代器更容易一些,如果没有足够的话,首先只返回尽可能多的项目。

答案 5 :(得分:1)

这看起来像你想要的吗?

10.times { |i|
  puts items[i].to_s
}

答案 6 :(得分:0)

items.each_with_index { |i, c| puts i and break if c <= 9 }

答案 7 :(得分:-1)

有人问道:

  

我想抓住前10个项目,然后离开&#34;每个&#34;循环。

使用throwcatch完成此操作,只需对示例进行少量更改:

catch(:done) do
    c = 0
    collected = []
    items.each do |item|
        collected << item
        throw(:done, collected) if c == 9 # started at 0
        c += 1
    end
    collected # if the list is less than 10 long, return what was collected
end

简单throw标有:done的{​​{1}}标签和等待collected的{​​{1}}将返回catch

对于&#34; ruby​​&#34;这一点:

:done

我不知道为什么有些人拒绝使用collected并使用catch(:done) do items.inject([]) do |collected, item| throw(:done, collected) if collected.size == 10 collected << item # collected gets returned here and populates the first argument of this block end end 代替(他们是等效的)显然给inject的空数组注入了{{1} }}Š!无论如何,如果少于10个项目,reduce将返回inject([])

大多数答案都试图回答问题的意图,而不是问题的内容,而item在这种情况下确实很有意义。但我可以想象想要抓住符合我100美元预算的第一件物品。那么你可以简单地说:

inject