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| 总计 << 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,所以您很好。

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 回答