ようへいの日々精進XP

よかろうもん

2018 年 02 月 01 日(木)

朝寝

  • うっかり朝寝坊してしまった
  • 毎朝のルーティンをことごとくサボった

ジョギング

  • お昼休みに香椎浜を 2 周
  • おニューのランニングシューズで...おろしたてなので固い感じ

日課

  • (腕立て x 50 + 腹筋 x 30) x 3

ジレンマ

  • 整理出来ていないけど, なんか色々とモヤモヤと
  • やりたいことが出来ていないし, Ruby Gold 2 回も落ちてるしな...

今日のるびぃ ~ インスタンスメソッドの method_missing ~

以下のようなコードがあった場合に, C2 をインスタンス化して適用にメソッドを呼んだ場合にどのような結果になるのか.

module A
  def method_missing(m)
    "module A の #{m}"
  end
end

module B
  def method_missing(m)
    "module B の #{m}"
  end
end

class C1
  def method_missing(m)
    "class C1 の #{m}"
  end
end

class C2 < C1
  include A
  include B

  def method_missing(m)
    "class C2 の #{m}"
  end
end

以下のように, C2 クラスの method_missing で捕捉される.

[8] pry(main)> C2.new.hoge
=> "class C2 の hoge"

では, 以下のように C3 クラスを追加した場合...

class C3 < C1
end

以下のように, C1 クラスの method_missing で捕捉される.

[10] pry(main)> C3.new.hoge
=> "class C1 の hoge"

引き続き, 以下のように C4 クラスを追加した場合...

class C4 < C1
  include A
  include B
end  

以下のように, モジュール B の method_missing で捕捉される.

[12] pry(main)> C4.new.hoge
=> "module B の hoge"
[13] pry(main)> C4.ancestors
=> [C4, B, A, C1, Object, PP::ObjectMixin, Kernel, BasicObject]

引き続き, 色々と試してみる.

[14] pry(main)> class C5 < C1
[14] pry(main)*   prepend A
[14] pry(main)* end  
=> C5
[15] pry(main)> C5.new.hoge
=> "module A の hoge"
[16] pry(main)> C5.ancestors
=> [A, C5, C1, Object, PP::ObjectMixin, Kernel, BasicObject]
[17] pry(main)> class C6 < C1
[17] pry(main)*   def method_missing(m)
[17] pry(main)*     super
[17] pry(main)*   end  
[17] pry(main)* end  
=> :method_missing
[18] pry(main)> C6.new.hoge
=> "class C1 の hoge"

ふむふむ. 存在しないメソッドを呼んだとしても, メソッドの探索経路は変わらない雰囲気をなんとなくだけど掴めた.