我有以下哈希:
{#<Dish:0x007fb45505ff30 @dish={:name=>"Chicken Pie", :price=>4.5}> => 2}
为了合计price * qty
(最后是2
),我使用的是代码:
@order.map { |item, qty| item.price * qty }.inject(:+)
返回值9
。
无论如何都要将此代码重写为以下内容:
@order.inject(0) { |item, qty| item.price * qty }
答案 0 :(得分:2)
以下是一个示例:
class Item
attr_reader :name, :price
def initialize(name, price)
@name = name
@price = price
end
end
data = {Item.new('Book', 10) => 2, Item.new('Sandwich', 33) => 1}
sum = data.inject(0) do |total, (item, amount)|
total + item.price * amount
end
puts "Total: #{sum}"
考虑到Keith的评论:自定义对象作为哈希键可能无法按预期工作,除非您已经处理了身份。
答案 1 :(得分:1)
@order.inject(0){|n, (item, qty)| n + item.price * qty}
答案 2 :(得分:0)
如果这个哈希中有多个菜,你会想要发生什么?你想要的实际行为是什么?
如果您只想知道单项哈希的总价格,并使用您的注入示例,您需要记住您正在尝试注入需要备注和元素块参数的哈希 - 在您的情况下,该元素将成为哈希中每个项目的键值对。
例如:
rwxr-xr-- root friends 34248 oct 14 2010 /bin/ping
看看你得到了什么。我猜是@order.inject(0) { |item, qty| puts item.inspect }
的一些东西。
因此,将该关键值数组捕获到另外两个args中。
[#<Dish:0x007fb45505ff30 @dish={:name=>"Chicken Pie", :price=>4.5}>, 2]