私はこの演習を行っています:
- この演習を行うには、おそらく を使用する必要があります
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 ポイント下げる必要がありました。編集。