この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。木田です。
入社してから業務でRubyを書くことが多く、クラス宣言直下のメソッドはいつ実行されるのか気になったので試してみます。
クラス定義内に任意のコードを書くことができる
Rubyではクラス定義内で任意のコードを書くことができ、初めてRubyを書いたときに少し戸惑った記憶があります。
どういうものかというと以下のようなコードになります。
class Klass
puts 'under Klass'
end
上記のコードを実行すると、 'under Klass' と表示されます。
Klassクラスのインスタンスを作成せずとも表示されたので、クラス定義が読み込まれた時点で実行されているのがわかります。
次はModuleとClassを定義して、ClassからModuleをインクルードして試してみましょう。
module A
puts 'under module A 01'
def self.included(obj)
puts 'under module A#included'
end
def self.extended(obj)
puts 'under module A#extended'
end
puts 'under module A 02'
end
module B
puts 'under module B 01'
def self.included(obj)
puts 'under module B#included'
end
def self.extended(obj)
puts 'under module B#extended'
end
puts 'under module B 02'
end
class Klass
include A
include B
puts 'under klass01'
def method_a
puts 'under Klass#method_a'
end
puts 'under klass02'
end
klass = Klass.new
puts klass.method_a
上記のファイルの実行結果。
under module A 01
under module A 02
under module B 01
under module B 02
under module A#included
under module B#included
under klass01
under klass02
under Klass#method_a
まず、先にModuleのA, Bが読み込まれて puts が実行されています。
次にKlassクラスがModule A, Bをインクルードしたあと、各Moduleの includedメソッド が呼び出されます。
そのあと、Klassクラスに書かれた puts が実行されて、最後にインスタンスメソッドの method_a が実行されます。
クラス定義内で書いたメソッドは、ファイルの先頭から順に実行されているのが分かりますね!
最後に
Rubyをあまり書き慣れてない方の参考になればと思います!
※サンプルコードにModuleの extendedメソッド も定義していましたが、このメソッドも特定のオブジェクトにモジュールが取り込まれたあとに実行されるメソッドです!