下記の問題を解いてみました。
http://asura23.blog.fc2.com/blog-entry-63.html
インスタンスメソッド探索経路
module M def method_missing(id, *arg) puts "M#method_missing()" end end class A include M # A.メソッド 時にメソッドが定義されていな場合は以下が呼び出される def method_missing(id, *arg) puts "A#method_missing()" end end class B < A # Aのインスタンスメソッドが継承される # Bにクラスメソッドを定義する class << self def method_missing(id, *arg) puts "B#method_missing()" end end end obj = B.new # メソッド探索:Bにはインスタンスメソッドがないので、Aのインスタンスメソッドを読み込む obj.x #=> A#method_missing()
クラスメソッド探索経路
module Module def method_missing(id, *args) puts "Module#method_missing()" end end class Class def method_missing(id, *args) puts "Class#method_missing()" end end module M def method_missing(id, *args) puts "M#method_missing()" end end class A include M def method_missing(id, *args) puts "A#method_missing()" end end class B < A def method_missing(id, *args) puts "B#method_missing()" end end # B→A→Class→Objectとクラスメソッドを探していく、存在しない場合、method_missing()を探す B.method_y # => Class#method_missing()
定数の探索経路
クラス内,スーパクラスと探し、なければクラス探索経路を探す。
superとsuper()
class A def initialize(*rest) puts "*rest=#{rest}" end end class B < A def initialize(first, *rest) # 第一引数を表示 puts "first1=#{first}" # 第二引数以降を表示 puts "rest1=#{rest}" # initializeと同じ引数でclass Aのinitializeを呼び出す super # 明示的に引数なしを指定すると引数なしでclass Aのinitializeを呼び出せる super() end end obj1 = B.new("A","B","C","D","E") #=> first1=A #=> rest1=["B", "C", "D", "E"] #=> *rest=["A", "B", "C", "D", "E"] #=> *rest=[]