2

主題が述べているように、IRBでシングルトンメソッドを使用しているときにスタックオーバーフローが発生しました。以下は私が試したコードです:

c= C.new
class << c
  def class
    "my class is #{self.class}."
  end
end

私が電話したときc.class、私は得ました:

SystemStackError: stack level too deep
Maybe IRB bug!

スタックサイズを調整する方法についてのリファレンスを見つけましたが、そもそもスタックサイズが何であるかがわかりません。

質問: なぜIRBでそのエラーが発生したのですか?また、Rubyシングルトン/クラスメソッドの実験を続けるにはどうすればよいですか?

4

4 に答える 4

3

まず最初にrecursion、関数が自分自身を呼び出すことができる場所で呼び出されるものがあります。これは、コードで意図せず行ったことです。

2 つ目は、スタックは関数呼び出しのトレースを保持するものです。再帰の終わりまたはスタックレベルの深さに達したときに、プログラムを正しく再開できるようにします。

次のようなものです: 関数 A と関数 B があるとします。

function A {
  /* some code */
  B()
  /* some more code */
}

function B {
  return / * something * /
}

マシンは基本的に A の実行を停止し、A の変数の状態をスタックに保存し、B を呼び出して実行します。最終的に B が終了すると、スタックからポップして A の実行を再開します。

classその特定の例では、独自のメソッドを定義したいためです。次のコードで行う必要があります。

def class
  "my class is #{super}"
end

お役に立てれば。

于 2013-02-09T14:21:35.470 に答える
1

オブジェクトを作成classし、このオブジェクトのメソッドを定義しました。そして、このメソッドでは、同じメソッドを呼び出していますclass。無限の再帰があります。

そのため、独自のメソッドを定義する場合は、システムに依存するキーワードの使用を避ける必要があります。例では、次のようになります。

class << c
  def klass
    "my class is #{self.class}"
  end
end
于 2013-02-09T14:09:50.160 に答える
1

スタックは、コンピューターのメモリ モデルに由来します。

すべてのプログラムにはheapと がありstackます。ヒープ部分は今のところ重要ではありません。

プログラムが関数を呼び出すと、いくつかのことが起こります。

  • プログラムの現在位置がスタックに置かれる
  • 現在のスコープの変数はスタックに配置されます

関数を終了すると、関数を呼び出す前のプログラムの状態を複製するために、これらのアクションが逆の順序で逆になります。

したがって、関数がそれ自体を呼び出すと (それが実行されます)、文字列 "my class is " と現在のプログラム位置がスタックに配置され、関数が再度起動されます。これは同じことを行います。

これは、プログラム用に予約された auf スタックの量を超えるまで、何度も繰り返されます。(これはオペレーティング システムに依存し、最終的には利用可能な RAM の量に依存し、常に有限です。) これは、この例外が発生したときです。システムは、スタック スペースが不足していることを通知しています。

これは通常、停止条件のない再帰でのみ発生します。

于 2013-02-09T14:17:19.430 に答える
0

スタックがどのように機能するかを説明するすべての素晴らしい回答に加えて、

classは Ruby の予約キーワードです。メソッドObject#classは固有の例外です。本当に再定義することはできません。

于 2013-02-09T15:20:51.790 に答える