読者です 読者をやめる 読者になる 読者になる

メタプログラミングRuby第五章 特異メソッド

特異メソッド

特異メソッドとは・・・特定のオブジェクトにメソッドを追加することです。

以下にコード例を示します。

hoge = "hoge"

def hoge.upcase?
    hoge.upcase #HOGE
end

モンキーバッチと違うことは?

モンキーバッチとはクラスにメソッドを追加及び修正が行えることです。

特異メソッドと同じようなコードを作成するには以下のような コードを記述することになります。

class String
  def upcase?
    if self == "monkey"
      self.upcase
    else
      self
    end
  end
end

p "monkey".upcase? #MONKEY
p "hoge".upcase? #hoge

しかし、このようなコードを記述すると 現在あるStringクラスに追加するので 間違いがあった際、String全域で間違ったコードが記述される可能性があります。

ダックタイピング

最初のコードに示した特異メソッドの対象となった hoge はStringクラスに属していますが オブジェクトとクラスは結びついていないため、 upcase? をいれたとしても元のStringクラスに 属しているメソッドを汚すことはない、

このようにRubyが用いることが出来るメソッドはその「オブジェクト」が決定します。

このような事象を 「ダックタイピング」と言います。

今回のケースで言えば、あるオブジェクトが Stringクラスのインスタンスかは気にする必要はないことです。 実際メソッドを使う際にはそのオブジェクトに紐付いているメソッドだけを着目すれば良いんです。