Rubyのリファレンスマニュアルを見てたら「メソッド定義のネスト」という今まで全然知らなかったものを見つけた。
文法的には、メソッド内にメソッドの定義を書けるらしい。
動きとしては、メソッドが実行されたときにメソッドを追加するという動きをする。
用途はよくわからないがとりあえず実験。
class Sample
def foo
puts 'Sample#foo called'
def bar
puts 'Sample#bar called'
end
puts 'bar methodが定義されました'
end
def method_missing msg_id, *args, &block
puts "未定義のmethod[#{msg_id}]が呼ばれました"
end
end
s = Sample.new
s.bar # error
s.foo
s.bar # ok
puts '----------------'
s2 = Sample.new
s2.bar # 他のインスタンスでもOK
赤い部分がメソッド定義のネストになる。
この場合は、fooメソッドを呼び出さない限りbarメソッドが使えない。
もし、fooメソッドを呼び出す前にbarメソッドを呼び出すとmethod_missingが呼び出される。
実行結果
未定義のmethod[bar]が呼ばれました
Sample#foo called
bar methodが定義されました
Sample#bar called
----------------
Sample#bar called
ん~。やっぱり用途がわからん…。
ちょっと仕事しながら考えてみよう。