コード:
c = 0
items.each { |i|
puts i.to_s
# if c > 9 escape the each iteration early - and do not repeat
c++
}
最初の10個のアイテムを取得し、「各」ループを終了します。
コメント行を何に置き換えますか?より良いアプローチはありますか?何かもっとRuby慣用句?
break
ソリューションは機能しますが、より機能的なアプローチがこの問題に本当に適していると思います。最初の10要素をtake
して印刷したいので試してください
items.take(10).each { |i| puts i.to_s }
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
はさらに良い。
break
はループから早期にエスケープするために機能しますが、items[0..9].each {|i| puts i}
。 (そして、あなたがしているのが文字通りまったく変更せずにアイテムを印刷するだけなら、あなたはただputs items[0..9]
。)
別のバリアント:
_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
_が必要だろう。)
別のオプションは
items.first(10).each do |i|
puts i.to_s
end
イテレータを壊すよりも少し読みやすく、十分でない場合は最初に利用可能なアイテムだけを返します。
これはあなたが望むもののように見えますか?
10.times { |i|
puts items[i].to_s
}
items.each_with_index { |i, c| puts i and break if c <= 9 }