0

さて、私はこれを何度も試し、何が起こったのかを理解しようとしました...

ハッシュ内のオブジェクトの束の量を合計したいとします。

orders = [{:price => 100, :qty => 5}, {:price => 120, :qty => 10}, {:price => 50, :qty => 5}]

上記のように、配列アイテム内のすべてのハッシュオブジェクトを合計したいと思います。

変数「sum」が結果であると仮定します。

sum = 0
sum = orders.each {|i| sum += i[:price] * i[:qty]}

ただし、同じハッシュオブジェクトを返します。

[{:price => 100, :qty => 5}, {:price => 120, :qty => 10}, {:price => 50, :qty => 5}]

結果は0+(100 * 5)+(120 * 10)+(50 * 5)になると思いました

なんでそうなの?

これに対する私の解決策は、次のようにすることです。sum = 0 total = []orders.each {| i | total << i [:price] * i [:qty]} total.each {| i | 合計+=i}

直感的ではないと思います

4

2 に答える 2

1

Hash#each は自分自身を返すため、ブロックを指定すると。こちらのドキュメントを参照してください: http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-each

あなたが望むことをする正しい方法は

sum = orders.map {|o| o[:price] * o[:qty] }.inject(0, :+)
于 2013-01-28T15:29:48.043 に答える
1

はい、Enumerable#each列挙したコレクションを返します。通常、その戻り値はまったく使用しません。すでにブロック内の合計を変更しているので、問題ありません。

sum = 0    
orders.each {|i| sum += i[:price] * i[:qty]}

より良い方法は、これに特化した方法を使用することです

orders = [{:price => 100, :qty => 5}, {:price => 120, :qty => 10}, {:price => 50, :qty => 5}]

sum = orders.reduce(0) do |memo, item|
  memo + item[:price] * item[:qty]
end

sum # => 1950
于 2013-01-28T15:30:32.917 に答える