質問: nilという部分よりも何行か後に書かれていました。 メソッドの定義というものはそのメソッドを使うよりも前にしておかなければエラーになると思っていたのですが、この場合何故エラーにならないのでしょうか?
回答: > メソッドの定義というものはそのメソッドを使うよりも前にしておかなければエラーになる > > はい、これは正しいです。 しかし、def fugaを定義した時点ではfugaというメソッドを定義しただけで、中のコードは評価されません。 そのため、System#fooメソッドが使われるタイミングというのはfugaを呼び出した時点になります。 ログに各タイミング書き出しながら実行すると分かりやすいかと思います。 #### sample.rb ``` puts '-- 1' def fuga(x) puts '-- #fuga' $system.foo = [] if $system.foo == nil end puts '-- 2' class System puts '-- System.attr_accessor' attr_accessor :foo end puts '-- 3' $system = System.new fuga(42) puts '-- 4' ``` これを実行すると、以下の順でログが表示され、fugaでfooを使用するよりも早くattr_accessorが呼ばれていることが分かります。 ``` -- 1 -- 2 -- System.attr_accessor -- 3 -- #fuga -- 4 ```