我正在做这个练习:
return self
。如果方法返回自身(它自身的一个实例),我们可以链接方法。MathDojo
的ruby类,它具有以下功能:add,subtract。这两个函数至少需要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>
如何返回对象的实例变量而不是对象本身?当我删除返回self
时,方法不再链接,虽然我能够进行单个方法调用:
MathDojo.new.subtract(2,3)
# => -5
如何修改代码以使链接按预期工作?
自我解决,不得不编辑,因为我的问题的投票让我处于回答我自己的问题所需的声誉之下。道歉。
在将数字注入数组之前,我需要展平数组。然后添加attr_accessor以收集在课外使用的总和。我也改变了隐含的自我回归:
return self
我通过输入以下内容修改了代码,如jbh的答案所示:
attr_accessor :sum
before my initialize method
然后我修改了add和subtract方法以包括调用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分,因为他们不喜欢我的问题的格式,所有需要做的就是编辑。
答案 0 :(得分:3)
如果方法被调用,您将无法知道该方法何时被调用。因此,您无法选择是否应该返回自身或总和值。
简单的答案是,创建一个应该在链调用结束时调用的求和方法
class MathDojo
attr_reader :sum
end
puts MathDojo.new.add(2).add(2, 5).subtract(3, 2).sum