2

私はこのRubyチュートリアルをフォローしています ここでは、スタックとキューについて話しています http://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/33-advanced-arrays/lessons/86-stacks- and-queues#solution4117

スタックの次のコードを提供します

class Stack
  def initialize
    @store = Array.new
  end

  def pop
   @store.pop
  end

  def push(element)
    @store.push(element)
    self
  end

  def size
    @store.size
  end
end

私の質問は、「push」メソッドで「self」を返す必要があるのに、pop メソッドでは self を返す必要がないのはなぜですか? ここでの違いは何ですか?

ありがとう!

4

3 に答える 3

7

Array#pushArray#popは異なるものを返します。1 つ目は変更された配列を返し、2 つ目はポップされた要素を返します。

変更された配列を返したくない理由は、カプセル化が破られ、オブジェクトの内部状態が公開されるためです。それでも、push 呼び出し (つまり ) を連鎖させたいStack.new.push(2).push(5)ので、nil などの代わりに ( 型の) self を返しStackます。

于 2013-04-25T04:04:59.360 に答える
3

ユースケースの違いによるものです。

  • を使用するときpushは、引数 とともに使用するとelement、操作が成功することがさらにわかります。メソッドからの値を取得することelementは役に立ちません。の戻り値を持つselfと、メソッドの連鎖が可能になるなど、より便利になります。
  • を使用するpop場合、便利なケースでは、配列に要素が含まれているかどうか (そうでない場合は誤り)、およびポップによって取得する要素がわからないことがあります。そして、ポップされた値を取り戻すことが、メソッドを使用する目的です。

言い換えれば、pushは「セッター/モディファイヤ」メソッドでありpop、(破壊的な)「ゲッター」メソッドです。

于 2013-04-25T05:22:22.763 に答える
2

Ruby の慣例では、ポップするとポップされるものを返し、プッシュするとデータ構造自体を返します。配列がどのように動作するかを確認してください。

于 2013-04-25T04:01:55.053 に答える