rubyの特異メソッド、特異クラスについて考えてみる

rubyMaganizeを読み直していた時に、丁度特異メソッドについて書かれていたので纏めの意味も込めて。
rubyのクラスメソッドは何気なく使っているが、改めて人に説明しようとしたときにネタとして特異メソッド、特異クラスについて考えた。
例えば

require 'animal'

class Dog < Animal
  def hello
    p 'wanwan'
  end

  # 特異メソッド方式のクラスメソッド
  def self.run
    puts 'this method is class method.'
  end
end

ここではrunというクラスメソッドを定義しているが、このself.runが特異メソッドです。selfというクラス自身を表すオブジェクトにメソッドを追加しています。

逆に

class Dog3
  #特異クラス方式のクラスメソッドの定義
  class << self
    def run
      puts 'this method is class method.'
    end
  end
end

これはclass << selfで特異クラスを定義し、その中でメソッドを定義することでDog3のクラスメソッドを定義しています。

以前rails3ではこの特異クラス方式の書き方が内部実装では多かったとrubyMaganizenには書かれていますが、確かにその印象ありました。
ただこれもrails4からはextend方式に変わって来ているらしいです(内部実装もっと見ないとなー)
特異クラスなので、

Dog3.ancestors
で継承関係をみても特別何かが追加sれた訳でもありません。これはextendを使った場合も同じですね。

取りあえずは以上です。コードをもっと読まないとですね!