我正在做这个练习:
- 要进行此练习,您可能必须使用
return self
. 如果方法返回自身(自身的一个实例),我们可以链接方法。 - 开发一个名为的 ruby 类
MathDojo
,它具有以下功能:加法、减法。让这 2 个函数至少接受 1 个参数。MathDojo.new.add(2).add(2, 5).subtract(3, 2)
应该执行0+2+(2+5)-(3+2)
并返回4
。
我有这个代码:
class MathDojo
def initialize
@sum = 0
end
def add(*numbers)
numbers.inject(@sum) { |sum, number| sum + number }
self
end
def subtract(*numbers)
numbers.inject(@sum) { |sum, number| sum - number }
self
end
end
现在,我的代码返回:
MathDojo.new.add(2).add(2, 5).subtract(3, 2)
# => #<MathDojo:0x0000000160b0c0>
如何返回对象的实例变量而不是对象本身?当我删除 return to 时self
,这些方法不再链接,尽管我能够进行单个方法调用:
MathDojo.new.subtract(2,3)
# => -5
如何修改我的代码以使链接按预期工作?
自我解决,不得不编辑,因为对我的问题的否决使我处于回答我自己的问题所需的声誉之下。我很抱歉。
在将数字注入数组之前,我需要展平数组。然后添加 attr_accessor 来收集总和以供课堂外使用。我还将 self 的隐含返回更改为:
return self
我通过输入以下内容修改了代码,如 jbh 的回答所示:
attr_accessor :sum
before my initialize method
然后我修改了加法和减法以包括调用 flatten:
@sum = numbers.flatten.inject(@sum) { |sum, number| sum + number }
@sum = numbers.flatten.inject(@sum) { |sum, number| sum - number }
然后正如 jbh 还显示的那样,我将 .sum 添加到我的链式方法中:
puts math1 = MathDojo.new.add(2).add(2, 5).subtract(3, 2).sum
还有一件事,人们谈论stackoverflow上的问题解决者是多么的粗鲁,今天我经历了这一点。我清楚地提到我是 Ruby 的新手(我应该说这只是我的第二天),我不得不让我的声誉被否决 2 分,因为他们不喜欢我的问题的格式,需要做的就是编辑。