使用“注入”在哈希中添加“值 * qty”



我有以下哈希:

{#<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) }

最新更新