ようへいの日々精進XP

よかろうもん

2018 年 02 月 16 日(金)

ジョギング

  • 休み
  • 走るのは休んだけど, 東京を色々と歩き回って疲れた

日課

  • 休み

東京日帰り出張

ホンコレ, とにかく疲れたけど, 打ち合わせして良かったと思う.

2018/02/16 ~ メソッド探索色々 ~

基本の型

class Cls1
  def method
    p 'Cls1#method'
  end
end

Cls1.new.method #=>"Cls1#method"

Cls1 を継承の型

class Cls1
  def method
    p 'Cls1#method'
  end
end

class Cls2 < Cls1
  def method
    p 'Cls2#method'
  end
end

Cls1.new.method #=>"Cls1#method"
Cls2.new.method #=>"Cls2#method"

Module1 を include の型(1)

module Mod1
  def method
    p 'Mod1#method'
  end
end

class Cls1
  def method
    p 'Cls1#method'
  end
end

class Cls2 < Cls1
  include Mod1
  def method
    p 'Cls2#method'
  end
end

Cls1.new.method #=>"Cls1#method"
Cls2.new.method #=>"Cls2#method"

Module1 を include の型(2)

module Mod1
  def method
    p 'Mod1#method'
  end
end

class Cls1
  def method
    p 'Cls1#method'
  end
end

class Cls2 < Cls1
  prepend Mod1
  def method
    p 'Cls2#method'
  end
end

Cls1.new.method #=>"Cls1#method"
Cls2.new.method #=>"Mod1#method"

Module1 を include の型(3)

module Mod1
  def method
    p 'Mod1#method'
  end
end

class Cls1
  prepend Mod1
  def method
    p 'Cls1#method'
  end
end

class Cls2 < Cls1
  def method
    p 'Cls2#method'
  end
end

Cls1.new.method #=>"Mod1#method"
Cls2.new.method #=>"Cls2#method"

Module1 を include の型(4)

Mod1#method superclass を呼んでみる.

module Mod1
  def method
    super
    p 'Mod1#method'
  end
end

class Cls1
  def method
    p 'Cls1#method'
  end
end

class Cls2 < Cls1
  prepend Mod1
  def method
    p 'Cls2#method'
  end
end

Cls1.new.method #=>"Cls1#method"
Cls2.new.method #=>"Cls2#method"
                #  "Mod1#method"

Mod1 を prepend しているので Mod1#method が出力されることは想像出来るんだけど, Cls2#method が出てしまうのはアレ??っ思ったので理由を考えてみる.

  • prepend Mod1 により Cls2 よりも前にメソッド探索が行われて Mod1#method となる
    • これは Cls2.ancestors を呼ぶことで確認出来る #=> [Mod1, Cls2, Cls1, Object, Kernel, BasicObject]
  • 但し, Mod1 には super があり, その superclass として Cls2#method が呼ばれて Cls2#method が出力される

んー, なんか違和感があるけど...続く.

ふむふむ.