Rubyのクラス定義直下のメソッドの実行タイミングについて
こんにちは。木田です。
入社してから業務で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メソッド も定義していましたが、このメソッドも特定のオブジェクトにモジュールが取り込まれたあとに実行されるメソッドです!