我有以下哈希:
{#<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 }
下面是一个示例:
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 的评论:作为哈希键的自定义对象可能无法按预期工作,除非您已经处理好了身份。
@order.inject(0){|n, (item, qty)| n + item.price * qty}
如果这个哈希中有多个菜,你想发生什么?您想要的实际行为是什么?
如果你只是想知道单个项目哈希的总价格,并使用你的注入示例,你需要记住你正在尝试注入一个哈希,这需要备忘录和元素块参数 - 在你的例子中,元素将是哈希中每个项目的键值对。
例如:
@order.inject(0) { |item, qty| puts item.inspect }
看看你得到了什么。我猜是类似于[#<Dish:0x007fb45505ff30 @dish={:name=>"Chicken Pie", :price=>4.5}>, 2]
的东西。
因此,将该键值数组捕获到另外两个参数中。
@order.inject(0) { |memo, (item, qty)| memo + (item.price * qty) }