逃げます。各{}の繰り返し早めのRuby
-
21-09-2019 - |
質問
コード:
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
とも グルビー休憩やり直し、次.
更新: チャックの回答 幅はRubyのように、 nimrodmの回答 を使用 take
がある場合があるとなお良い。
break
は早期にループからの脱出のために動作しますが、それだけでitems[0..9].each {|i| puts i}
を行うには、より慣用的です。 (そして、もしあなたがやっているすべては文字通りあなただけputs items[0..9]
を行うことができ、すべての変更なしでアイテムを印刷している。)
別のオプションは以下のようになります。
items.first(10).each do |i|
puts i.to_s
end
イテレータに壊すよりも、私にはより簡単に少しを読み、十分に存在しない場合は、最初に使用可能な限り多くのアイテムとしてのみ返されます。
他の変形ます:
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
が必要になります。)
いあなたが望むようなこの表情?
10.times { |i|
puts items[i].to_s
}
items.each_with_index { |i, c| puts i and break if c <= 9 }
これは、依頼されました。
私は最初の10の項目を取得したいし、「それぞれの」ループを残します。
の例をいくつかの変更で、これを実現するために使用しthrow
とcatch
ます:
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
を返しますcollected
を待っているcatch
とラベル: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
に与えられた明確に空の配列がreduce
sを注入されているときに(彼らは同じです)の代わりにinject([])
と使用item
を使用することを拒否する理由を私は知りません! 10未満の項目がある場合はとにかく、inject
はcollected
を返します。
ほとんどの答えは、代わりに尋ねたとitems.take(10)
が、その場合には、完璧な理にかなっていたかの質問の意図が何であるかお答えしようとしています。しかし、私は私の$ 100の予算内に収まる最初の項目をつかむしたい想像することができます。その後のことができます単純ます:
catch(:done) do
items.inject({items: [], budget: 100}) do |ledger, item|
remainder = ledger[:budget] - item.price
if remainder < 0
throw(:done, ledger)
else
ledger.tap do |this|
this[:items] << item
this[:budget] = remainder
end # tap just returns what is being tapped into, in this case, ledger
end
end
end