0

我正在做这个练习:

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

4

1 回答 1

3

你无法知道一个方法何时被调用,如果它之后会有一个链式调用。因此,您无法选择是否应该返回 self 或 sum 值。

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

class MathDojo
  attr_reader :sum
end

puts MathDojo.new.add(2).add(2, 5).subtract(3, 2).sum
于 2013-09-10T23:09:13.187 回答