(モジュールコードブロックの変数は、ローカル変数でもあるし、グローバル変数でもあります。variable)です。関数を呼び出すには、引数を一つづつ渡す。ように関数から名前を削除する、という書き方はできない。よって、以下はエラーとなる。y無名関数を書くには、ラムダ形式を利用する。y関数の呼び出し方は、ネストした関数と同じ。メソッドを定義してみる。「引数の数が違う」とエラーがでる。手続きオブジェクトを使い、外側の変数を参照これに対処するには、ネストしたメソッドの代わりに、手続きオブジェクトを利用しなければならない。生成するか、もしくは、以下の形式を使う。メソッドの呼び出しにより、手続きオブジェクトが返される。メソッドを書くのが面倒なら、[]を使えばよい。よる手続きオブジェクトの呼び出しは、配列の要素を参照するメソッドと被るので、あまり好きではない。}}[1][2]やはり、スッキリとした書き方とは思えない。よると、ネストされた定義式は、それを定義したメソッドが実行された時に定義されます。ドキュメントにこのように書かれているので、定義することはできるようだ。クラスとインスタンス変数の関係に似ている。オブジェクトのインスタンス変数はクラスと何のつながりもない。インスタンス変数は値を代入したときに初めて出現する。メソッドを呼び出さなければ、存在しない。Object#instance_variablesModule#attr_accessorネストしたメソッドは定義できる。そのため、下記のコードを実行しても、エラーがでなかった。メソッドは、トップレベルから呼び出すことができる。ローカル変数でもメソッドとしても定義されてないという内容のエラーが表示された。未定義のローカル変数や定数を使用したときに発生します。他の言語のように、ネストした関数と同じつもりで書くことはできない。内部スコープから、外部スコープを参照できない内側のメソッドから、外側のメソッドの変数を参照できなかった。スコープの仕様による。した可視性の入れ子構造は存在せず、スコープはきちんと区別されている。新しいスコープに入ると、束縛は新しい束縛と交換される。いったキーワードで印が付けられている。3つのキーワードはそれぞれスケープゲートのように振る舞う。(p115)クラスやモジュールの定義のコードはすぐに実行される。メソッド定義のコードは、メソッドを呼び出したときに実行される。よるメソッドの定義は、メソッドの呼び出しのときに実行される。メソッドの呼び出しにより、新しいスコープに切り替わる。ネストしたメソッドが実行されるとき、新しいスコープに切り替わり、外側のスコープの変数を参照できない。よるスコープの制約を超えて、変数を参照したい場合、Class.newModule.newModule#define_method()を利用する。これを「フラットスコープ」と呼ぶそうだ。メソッドは、トップレベルに定義した。トップレベルに定義するメソッドは、関数定義のように見える。メソッドを持つ、特別なクラスを作成する必要がない。コードはオブジェクト(カレントオブジェクト)の内部で実行される。キーワードでアクセスできるからだ。対するメソッドの呼び出しになる。小さなデバッガになったと考えてみよう。ブレークポイントに当たるまで命令文を次々に渡っていくとする。一息ついて、周りを見てみよう。どんな景色が見えるだろうか?それがあなたのスコープだ。スコープ一面に束縛があるはずだ。足元をみると、ローカル変数がいくつもある。顔を見上げると、自分がオブジェクトの中に立っていることに気づく。傍にはメソッドとインスタンス変数がいる。遠くのほうに定数のツリ-がはっきりと見える。これで自分の位置が把握できた。目を細めてもっと遠くを見ると、グローバル変数がたくさん見える。クラスが実行主体となる。クラスのインスタンスが実行主体となる。実はRubyプログラム実行中はどこにいようとselfが設定されている。トップレベルにもクラス定義文にもselfがあるのだ。トップレベルでもselfがある。トップレベルのselfは、mainという。なんの変哲もない、Objectクラスのインスタンスだ。トップレベルのself即ちmainはObjectのインスタンスなので、トップレベルでもObjectのメソッドが呼べるということになる。pやputsなどの「関数風メソッド」が定義されている(図10)。トップレベルでもpやputsが呼べるのだ。@IT多くの言語では、トップレベルの関数(メソッド)にはレシーバーがないが、Rubyではトップレベルで関数を定義すると、それは暗黙的にmainオブジェクトの”関数的”メソッドとして定義される。Rubyではすべてがメソッドで、動的束縛を行うためメソッド探索のコストがかかる。クラスのメソッドとなる。メソッドを持ったクラスの中のようなもの。「オブジェクト」が、プログラムの基本的な要素として扱われる。扱える全ての値はオブジェクトです。オブジェクトに対して可能な操作はメソッド呼び出しのみです。あるオブジェクトが反応できるメソッドは、そのオブジェクトが所属するクラスによって一意に決定します。純粋な関数は存在しない。関数のように見える記述も、全てオブジェクトのメソッド。クラスもオブジェクトとして扱われる。出力したとき、クラス名であるPersonが表示された。このとき、実行主体はクラスを表すオブジェクト。ように「静的なクラス定義と、実行中の動的なオブジェクトが別の世界にある」イメージとは趣が違う。クラスのインスタンス。呼び出せば、所属するクラスを確認できる。詳しくは、以下を参照。p46、オブジェクトの内部には、インスタンス変数とクラスへの参照があるだけだ。...メソッドは、オブジェクトじゃなくて、クラスにあるんだ。...クラスはオブジェクトである。クラスのインスタンスなのだ。世界線航跡蔵オブジェクトはクラスに所属し、クラスはメソッドを持つ。逆に言えば、メソッドは必ずどこかのクラスに所属する。よって、ネストしたメソッドも、所属先のクラスがある。引数のデフォルト式も含め、すべてそのメソッドのコンテキストで評価されます。リファレンスマニュアルを読んでいると、「コンテキスト」という言葉を、しばしば見かける。Object#instance_eval。オブジェクト自身をブロックパラメータとするブロックを評価してその結果を返します。そのオブジェクトにして実行するということです。