Rubyのクラス定義直下のメソッドの実行タイミングについて

2018.03.27

こんにちは。木田です。

入社してから業務で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メソッド も定義していましたが、このメソッドも特定のオブジェクトにモジュールが取り込まれたあとに実行されるメソッドです!