質問

コード:

 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などがある。でも条約の利用 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 とも グルビー休憩やり直し、次.

更新: チャックの回答 幅は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の項目を取得したいし、「それぞれの」ループを残します。

の例をいくつかの変更で、これを実現するために使用し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を返しますcollectedを待っているcatchとラベル:donecollectedます。

と "ルビー"、このビットまでます:

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に与えられた明確に空の配列がreducesを注入されているときに(彼らは同じです)の代わりにinject([])と使用itemを使用することを拒否する理由を

私は知りません! 10未満の項目がある場合はとにかく、injectcollectedを返します。

ほとんどの答えは、代わりに尋ねたと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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top