試してみればスグわかることメモ(の確認)
http://d.hatena.ne.jp/skalabe/20101004/1286183085
rubyで試してみた。
irb(main):001:0> before = String.new "Before" => "Before"
Stringのインスタンス生成。
irb(main):002:0> before.add_method NoMethodError: undefined method `add_method' for "Before":String from (irb):2 from D:/Program Files/Ruby-1.9.2/bin/irb.bat:20:in `<main>'
この時点では、存在しないメソッド(add_method)は当然呼び出せない。
irb(main):003:0> class String irb(main):004:1> def add_method() irb(main):005:2> p "add" irb(main):006:2> end irb(main):007:1> end => nil
add_methodを追加。
irb(main):008:0> after = String.new "After" => "After"
メソッド追加後のインスタンスを生成。
それぞれで呼び出してみる。
before.add_methodはエラーになるんじゃないかと思うけど、
irb(main):009:0> after.add_method "add" => "add" irb(main):010:0> before.add_method "add" => "add"
なんと呼び出せてしまう。
クラスメソッドなのか?とStringクラスに呼び出してみる。
irb(main):011:0> String.add_method NoMethodError: undefined method `add_method' for String:Class from (irb):11 from D:/Program Files/Ruby-1.9.2/bin/irb.bat:20:in `<main>' irb(main):012:0>
インスタンスメソッドのようだ。
結論: 処理系にもよるが、メソッド追加前のインスタンスにも 追加したメソッドが追加されている。 これはRubyのインスタンスメソッドがクラスにあるからだと思う。 インスタンスに対するインスタンスメソッド呼び出しには 1回クラスを経由するから、メソッドが追加された場合、 動的に認識できるものと思われる。(キツッ 多分。。。