試してみればスグわかることメモ(の確認)

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回クラスを経由するから、メソッドが追加された場合、
 動的に認識できるものと思われる。(キツッ
 多分。。。