読者です 読者をやめる 読者になる 読者になる

気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

ruby メソッド探索を確認する

下記の問題を解いてみました。
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=[]