我有一个名为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
但它不起作用。你知道我怎么能达到这个目标吗?
答案 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 }
请注意,我没有将food1
,food2
,food3
或menu
定义为实例变量。可能有理由这样做,但不仅仅是为了获得价格的总和。
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
作为参数,因此会引发异常。