使用`inject`在哈希中添加`value * qty`

时间:2016-06-05 13:21:32

标签: ruby hash iteration inject

我有以下哈希:

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

3 个答案:

答案 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]