好吧,我已多次尝试过,并试图找出发生的事情......
假设我希望将哈希中的一堆对象的数量相加:
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}
我认为它根本不直观
答案 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