Ruby 使用“inject”在散列中添加“value*qty”

Ruby 使用“inject”在散列中添加“value*qty”,ruby,hash,iteration,inject,Ruby,Hash,Iteration,Inject,我有以下散列: {#<Dish:0x007fb45505ff30 @dish={:name=>"Chicken Pie", :price=>4.5}> => 2} 它返回的值为9 是否有必要将此代码重写为以下内容: @order.inject(0) { |item, qty| item.price * qty } 以下是一个示例: class Item attr_reader :name, :price def initialize(name, pric

我有以下散列:

{#<Dish:0x007fb45505ff30 @dish={:name=>"Chicken Pie", :price=>4.5}> => 2}
它返回的值为
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的评论:作为散列键的自定义对象可能无法按预期工作,除非您考虑了标识。

以下是一个示例:

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}"
@order.inject(0){|n, (item, qty)| n + item.price * qty}

考虑Keith的评论:作为散列键的自定义对象可能无法按预期工作,除非您考虑了标识。

如果此散列中有多个盘,您希望发生什么?你想要的实际行为是什么

@order.inject(0){|n, (item, qty)| n + item.price * qty}
如果您只想知道单个项目散列的总价,并使用您的注入示例,那么您需要记住您正在尝试注入一个散列,它需要memo和元素块参数——在您的情况下,元素将是散列中每个项目的键值对

例如:

@order.inject(0) { |item, qty| puts item.inspect }
看看你能得到什么。我猜是类似于
[#鸡肉馅饼],:price=>4.5}>,2]
的东西

因此,将键值数组捕获到另外两个参数中

@order.inject(0) { |memo, (item, qty)| memo + (item.price * qty) }

如果这个杂烩里有不止一道菜,你希望发生什么?你想要的实际行为是什么

如果您只想知道单个项目散列的总价,并使用您的注入示例,那么您需要记住您正在尝试注入一个散列,它需要memo和元素块参数——在您的情况下,元素将是散列中每个项目的键值对

例如:

@order.inject(0) { |item, qty| puts item.inspect }
看看你能得到什么。我猜是类似于
[#鸡肉馅饼],:price=>4.5}>,2]
的东西

因此,将键值数组捕获到另外两个参数中

@order.inject(0) { |memo, (item, qty)| memo + (item.price * qty) }

使用自定义对象作为哈希键时要小心。您是否实现了hash和==或eql?方法?如果你使用Rails,你可以使用
sum
@order.sum{item,qty{item.price*qty}
@potashin如果这是Rails,那么它后面可能有一个DB,你可以轻松地在DB中求和,甚至不需要加载记录。@pascalbetz:不一定,它可以是远程API或任何你能想象的东西,哪个结果可以转换成某种东西,可以由
可枚举的
来处理。这一点很好。所以“如果它是AR”,那么您可以在DB中执行。小心使用自定义对象作为哈希键。您是否实现了hash和==或eql?方法?如果你使用Rails,你可以使用
sum
@order.sum{item,qty{item.price*qty}
@potashin如果这是Rails,那么它后面可能有一个DB,你可以轻松地在DB中求和,甚至不需要加载记录。@pascalbetz:不一定,它可以是远程API或任何你能想象的东西,哪个结果可以转换成某种东西,可以由
可枚举的
来处理。这一点很好。所以“如果它是AR”,那么您可以在DB中执行它。