1

私はルビーの初心者です。問題に対して次のコードを書きました。このコードは正しいと思います。

class Array 
  def sum
    result = 0
    self.each do |x|
      result += x
    end
    result
  end
end

私が知りたいのは、.selfメソッド内でsumメソッドを使用せずに正確なコードを記述する方法です。これが私がやろうとしていることです...次のコードが間違っていることは知っていますが、私が何をしようとしているのかがわかります。

class Array
  def initialize
    @array = []
  end

  def sum (@array)
    result = 0
    @array.each do |x|
      result += x
    end
    result
  end
end

したがって、私がやろうとしているのは、sumメソッドを使用せずにメソッドに引数を渡すことで、このコードを機能させる.selfことです。何か助けはありますか?ありがとう!

4

4 に答える 4

1

下はどうですか?

class Array
  def sum
    inject(0,:+)
  end
end
[2,9].sum # => 11

自己なし:(良いコードではなく、上記のものを使用してください)

class Array
  def sum
    result = 0
    each do |x|
        result += x
    end
    result
  end
end
[1,1].sum # => 2
于 2013-08-16T21:02:03.367 に答える
1

Ruby では、self を使用しない場合、self が暗示されます。あなたのコードを例として使用します。

コードに と入力しself.eachます。あなたが単に書いeachたなら、それもうまくいくでしょう。コードのスニペットは次のようになります。

def sum
  result = 0
  each do |x|
    result += x
  end
  result
end

それはまったく同じように機能します。

[1,2,3,4].sum
#=> 10

なんで?この場合[1,2,3,4]selfでありeach、メソッドが呼び出されていないため、selfが暗示され、コードは と言ったかのように解釈されますself.each。この場合、多くの場合と同様に、 と入力する必要があることに注意してくださいself.each。したがって、上に書いた方法が最適です。

私があなただったら、今すぐ探検しinjectます。inject メソッドを呼び出すことで、メソッドが行うことを行うことができます。

[1,2,3,4].inject { |accum, elem| accum + elem }
#=> 10

さらに良いことに、

[1,2,3,4].inject(:+)
#=> 10

Ruby の奥深さ、この非常に興味深い方法、およびその仕組みについては、皆さんにお任せしますinject(:+)。注: インターネットで読む場合:inject:reduce同じです。配列の場合:countと同様です。についてのヒントとして前に置いておきます。:length : inject(:+)

于 2013-08-16T21:32:24.700 に答える