人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Rubyのattr_accessorに関する質問です。
当方Rubyの勉強を始めたばかりなのですが、
あるホームページに掲載されていたrubyのサンプルコードを見ていると
def fuga(x)
$system.foo = [] if $system.foo == nil
end
という部分がありました。
『.の後に続く部分はメソッド名である』ということを思い出し、fooというメソッドの定義を調べてみようとfooで全体検索をかけてみたのですが、def fooという部分が見つからず
その代わりに
attr_accessor :foo
という部分が見つかりました。
それでattr_accessorという命令について調べてみた所、このattr_accessorがfooの定義をしているのだということが分かりました。しかし、このattr_accessorは最初の$system.foo = [] if $system.foo == nilという部分よりも何行か後に書かれていました。

メソッドの定義というものはそのメソッドを使うよりも前にしておかなければエラーになると思っていたのですが、この場合何故エラーにならないのでしょうか?

●質問者: tainaikappa
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Sheile
ベストアンサー

メソッドの定義というものはそのメソッドを使うよりも前にしておかなければエラーになる

はい、これは正しいです。
しかし、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

tainaikappaさんのコメント
ありがとうございます!定義しただけでは評価されるわけではないのですね。丁寧に教えて頂けて、とてもよく理解できました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ