使用reduce来对数组中对象的属性求和

时间:2017-07-04 01:55:46

标签: ruby collect

我有一个名为systime()的班级;它是一个非常简单的类,它只有名称,价格和Kcal。我创建了三种Food

Food

然后我创建了一系列名为@Food1 = Food.new("Pear", 12, 120) @Food2 = Food.new("Apple", 15, 100) @Food3 = Food.new("Banana", 20, 200) 的食物:

Menu

我需要将所有@Menu = [@Food1, @Food2, @Food3] prices方法相加,并将它们存储在reduce中。我已为@Food1类实现了+方法:

food

我正在尝试:

def + (other)
    @price + other.price
end

但它不起作用。你知道我怎么能达到这个目标吗?

1 个答案:

答案 0 :(得分:3)

最简单的方法是按如下方式编写。

class Food
  attr_reader :price
  def initialize(name, price, kcal)
    @name, @price, @kcal = name, price, kcal
  end
end

food1 = Food.new("Pear",   12, 120)
food2 = Food.new("Apple",  15, 100)
food3 = Food.new("Banana", 20, 200)
menu = [food1, food2, food3]`enter code here`

menu.reduce(0) { |t,food| t+food.price }
  #=> 47

或(对于Ruby v2.4 +)

menu.sum { |food| food.price }

请注意,我没有将food1food2food3menu定义为实例变量。可能有理由这样做,但不仅仅是为了获得价格的总和。

Food.new.price是一个整数,当然定义了Integer#+,因此没有特别的理由在类上定义和实例方法+

假设您确实在类中添加了一个实例方法:+

def +(other)
  price + other.price
end

这将允许你写

food1 + food2
  #=> 27

(虽然价格总结并不直观)。但是,你不能写

food1 + food2 + food3

因为首先执行food1 + food2,返回27,然后尝试执行

27 + food3

的语法糖
27.+(food3)

此处:+是一个Integer方法,它不接受food3作为参数,因此会引发异常。