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中执行它。