モジュールにinitializeメソッドを定義する時の注意


module Mod
def initialize
puts 'module initialized'
end
end

class Parent
def initialize
puts 'parent class initialized'
end
end

class Child < Parent
include Mod
def initialize
super
end
end

Child.new

実行結果

module initialized
initializeメソッドを持つモジュールをインクルードすると、スーパークラスで定義した初期化処理がされなくなる。
これを避けるためにはモジュールのinitializeメソッドの中でもsuperを呼ぶようにする。

module Mod
def initialize
super
puts 'module initialized'
end
end

class Parent
def initialize
puts 'parent class initialized'
end
end

class Child < Parent
include Mod
def initialize
super
end
end

Child.new

実行結果

parent class initialized
module initialized
さらにこのモジュールを汎用化するためにinitializeメソッドを以下のように修正すれば、インクルード元クラスのinitializeがどんな引数を持っていても、スーパークラスのinitializeに処理を投げられるようになる。

module Mod
def initialize(*args, &block)
super
puts 'module initialized'
end
end

そもそもモジュールにinitializeやsuperを書くこと自体どうなのかとも思ったけど、
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/29888 のようにコミッタの方が良しとしてるのだからありなのだろう。