メタプログラミング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クラスのインスタンスかは気にする必要はないことです。 実際メソッドを使う際にはそのオブジェクトに紐付いているメソッドだけを着目すれば良いんです。