有线红宝石散列每个功能

时间:2013-01-28 15:26:06

标签: ruby hash enumeration

好吧,我已多次尝试过,并试图找出发生的事情......

假设我希望将哈希中的一堆对象的数量相加:

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     总= []     orders.each {| i |总<<我[:price] *我[:qty]}     total.each {| i |总和+ = i}

我认为它根本不直观

2 个答案:

答案 0 :(得分:1)

因为Hash#每个都返回自己,如果给出了块。请参阅此处的文档:http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-each

正确的做法是

sum = orders.map {|o| o[:price] * o[:qty] }.inject(0, :+)

答案 1 :(得分: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