如何从设计为链方法的对象返回最终结果

时间:2013-09-10 23:04:06

标签: ruby instance-variables

我正在做这个练习:

  • 要执行此练习,您可能必须使用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分,因为他们不喜欢我的问题的格式,所有需要做的就是编辑。

1 个答案:

答案 0 :(得分:3)

如果方法被调用,您将无法知道该方法何时被调用。因此,您无法选择是否应该返回自身或总和值。

简单的答案是,创建一个应该在链调用结束时调用的求和方法

class MathDojo
  attr_reader :sum
end

puts MathDojo.new.add(2).add(2, 5).subtract(3, 2).sum