ジョギング
- 休み
- 走るのは休んだけど, 東京を色々と歩き回って疲れた
日課
- 休み
東京日帰り出張
朝5時に起きて、7時に福岡を経てば 8 時半には渋谷のハチ公前でお茶を一杯飲める。この距離感に震えた。
— Yohei Kawahara(かっぱ) (@inokara) 2018年2月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
が出力される
んー, なんか違和感があるけど...続く.
ふむふむ.