0

私はこの演習を行っています:

  • この演習を行うには、おそらく を使用する必要がありますreturn self。メソッドがそれ自体 (それ自体のインスタンス) を返す場合、メソッドをチェーンできます。
  • 次の関数を持つと呼ばれる ruby​​ クラスを作成しMathDojoます: add、subtract。これら 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>

オブジェクト自体ではなく、オブジェクトのインスタンス変数を返すにはどうすればよいですか? への戻りを削除する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

もう1つ、問題解決者であるstackoverflowの人々がいかに厄介であるかについて人々が話し、今日私はそれを経験しました。私は、私が Ruby を初めて使用したことを明確に述べました (まだ 2 日目だと言うべきでした)。私の質問の形式が気に入らなかったため、評判を 2 ポイント下げる必要がありました。編集。

4

1 に答える 1

3

メソッドの後にチェーン呼び出しがある場合、メソッドがいつ呼び出されるかを知ることはできません。したがって、自分自身を返すか合計値を返すかを選択することはできません。

そのための簡単な答えは、チェーン呼び出しの最後に呼び出される 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 に答える