web-dev-qa-db-ja.com

.each {}反復をRubyの早い段階でエスケープする

コード:

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

最初の10個のアイテムを取得し、「各」ループを終了します。

コメント行を何に置き換えますか?より良いアプローチはありますか?何かもっとRuby慣用句?

39
BuddyJoe

breakソリューションは機能しますが、より機能的なアプローチがこの問題に本当に適していると思います。最初の10要素をtakeして印刷したいので試してください

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

Rubyには++演算子はありません。複数行ブロックにdoおよびendを使用することも慣例です。ソリューションを変更すると、次の結果が得られます。

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、Next も参照してください。

更新:チャックの答え 範囲付きはよりRubyに似ており、 nimrodmの答え using takeはさらに良い。

47
Sarah Vessels

breakはループから早期にエスケープするために機能しますが、items[0..9].each {|i| puts i}。 (そして、あなたがしているのが文字通りまったく変更せずにアイテムを印刷するだけなら、あなたはただputs items[0..9]。)

7
Chuck

別のバリアント:

_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
Telemachus

別のオプションは

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

イテレータを壊すよりも少し読みやすく、十分でない場合は最初に利用可能なアイテムだけを返します。

4
Emily

これはあなたが望むもののように見えますか?

10.times { |i|
  puts items[i].to_s
}
1
Chris Lutz
items.each_with_index { |i, c| puts i and break if c <= 9 }
0
khelll