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を使った場合も同じですね。
取りあえずは以上です。コードをもっと読まないとですね!