モジュールにinitializeメソッドを定義する時の注意
実行結果
module Mod
def initialize
puts 'module initialized'
end
endclass Parent
def initialize
puts 'parent class initialized'
end
endclass Child < Parent
include Mod
def initialize
super
end
endChild.new
initializeメソッドを持つモジュールをインクルードすると、スーパークラスで定義した初期化処理がされなくなる。
module initialized
これを避けるためにはモジュールのinitializeメソッドの中でもsuperを呼ぶようにする。
実行結果
module Mod
def initialize
super
puts 'module initialized'
end
endclass Parent
def initialize
puts 'parent class initialized'
end
endclass Child < Parent
include Mod
def initialize
super
end
endChild.new
さらにこのモジュールを汎用化するためにinitializeメソッドを以下のように修正すれば、インクルード元クラスのinitializeがどんな引数を持っていても、スーパークラスのinitializeに処理を投げられるようになる。
parent class initialized
module initialized
そもそもモジュールにinitializeやsuperを書くこと自体どうなのかとも思ったけど、
module Mod
def initialize(*args, &block)
super
puts 'module initialized'
end
end
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/29888 のようにコミッタの方が良しとしてるのだからありなのだろう。