属性を設定していないため。同じ内容のブロックでも、コンテキストが変化することにより、評価の結果が異なる。ここでローカル変数というのは、参照できる限り外側のスコープも含めた全部だ。selfというのはデフォルトでメソッドを受け取る相手である。Rubyのプログラムにはいつでもselfがいて、擬似変数selfを通じてアクセスできるのであった。Rubyでは、メソッドはselfに定義されると考えたくなるが、そうではない。実はこれが前に名前だけ触れたklassである。klassは正式な用語ではなく、この記事では仮にそう呼ぶというだけである。...Rubyレベルでは表にあわれないがRuby処理系は内部でここでいうklassを常に保持している。これは「今メソッドを定義したらどこに定義されるか」というクラスである。この存在を考えるとRuby文法の理解がすっきりする。トップレベルでは"main"と呼ばれるある特定のObjectインスタンスがselfなのに、トップレベルでメソッドを定義するとObjectのインスタンスメソッドになる。defの中に更にdefを書くと、それらのdefを含むクラスのインスタンスメソッドになる。メソッドは「selfに対して」定義されるわけではないのだ。トップレベルではselfはmainで、klassはObjectだ。klassも同じになる。defの中を評価するときは(メソッドを実行するときは)selfはレシーバーで、klassはレシーバーのクラスである。典型的な手続き型言語のイメージだと、手続き呼び出しのたびに、ローカル変数領域や戻る場所など手続き一つの実行のために必要な情報を構造体(スタックフレーム)に格納し、それをスタックに積む。Rubyでは...理由がいろいろあって、スタックはなんと七本もある。ruby_classはdefでメソッドを定義するときに対象となるクラスを表す。ruby_classになることがある。(同上より)ruby_scopeはローカル変数スコープを表すスタックである。メソッド・クラス定義文・モジュール定義文・特異クラス定義文などが独立したスコープだ。「メソッドの評価は、すべてそのメソッドのコンテキストで評価される。外側のメソッドのローカル変数を参照することはできない。簡単にいえば、外側のメソッドと同じレジーバーのクラスに、ネストしたメソッドが追加される。クラスのメソッドになる。メソッドを呼び出すことができた。適当にトップレベルにネストしたメソッドを定義し、呼び出しを行なってみる。メソッドが定義されたのが分かる。クラス定義におけるネストしたメソッドは、そのクラスに所属する次に、トップレベルでネストしたメソッドを定義した場合と、クラスで定義した場合を比較する。クラスで、ネストしたメソッドを定義し、呼び出してみる。クラスのメソッドとして呼び出せた。ネストしたメソッドは、外側のメソッドが所属するクラスに属する。ところで、このように書けるメリットはあるのだろうか?あるメソッドを実行したときに、新規にメソッドを追加したり、別のメソッドを上書きして、挙動を変化させることに意味が見いだせれば、使いどころがある。内側に定義したメソッドにおいて、自由変数を使えないのはデメリットな気がする。クラスに定義されている。Object#methodsそのオブジェクトに対して呼び出せるメソッド名の一覧を返します。メソッドの名前を返します。メソッドは含まれないことに注意。以外に、以下のメソッドが定義されている。メソッド名の一覧を配列で返します。以外に、以下のメソッドが定義されている。メソッドを調べてみる。オブジェクトのプライベートメソッドとして追加されているのが分かる。メソッドについて確認すると、パブリックメソッドとして追加されていた。オブジェクトとして取り出してみる。よりオブジェクト化されたメソッドオブジェクトのクラスです。メソッドの実体(名前でなく)とレシーバの組を封入します。オブジェクトと違ってコンテキストを保持しません。オブジェクトとして取り出す。メソッドも取り出してみる。p110ブロックは単体では実行できない。いった環境が必要になる。...ブロックを定義すると、その時その場所にある束縛を取得する。ブロックをメソッドに渡すときは、その束縛も一緒に持っていく。アンインストールした後、あるアプリケーションを起動していると、以下のエラーが表示される。デバッガを使用できません。クリックしてください。クリックしてください。再インストールしたけれど、エラーは表示され続ける。