[ruby-list:47940] Re: 特異クラス、特異メソッド

From: "Y. NOBUOKA" <nobuoka@...>
Date: 2011-03-08 10:45:53 UTC
List: ruby-list #47940
そえじまさん

信岡です。
特異メソッドや特異クラスに関しては Yugui さんの記事 [1] が参考に
なるかと思います。
[1] http://yugui.jp/articles/768

> 例えば、上記のようなMyClassのオブジェクトが複数あった場合に
> そのオブジェクトごとに挙動を変えるとか、そういう意味あいの
> ことなのでしょうか?

オブジェクトごとに挙動を変えるため、というよりもむしろ「あるオブジェクトに
固有のメソッドを定義するため」 に特異クラスが存在すると考えればよいと思います。
ここで、「オブジェクトに固有のメソッド」 というのが特異メソッドであり、
特異メソッドを定義するためのクラスが特異クラス、ということになります。
(特異メソッドのわかりやすい例としては、クラスメソッドが挙げられます。
クラスメソッドはクラスオブジェクトに固有のメソッドなので、特異メソッドです。)

例えば、JavaScript であれば、オブジェクトに固有のメソッドは次のように
簡単に定義できます。

var str1 = new String( "str1" );

// str1 に固有のメソッドを定義する
str1.eigenMethod = function () { /* ... */ };

JavaScript ではオブジェクトそのもののプロパティとしてメソッドを定義できるので、
オブジェクト固有のメソッドは上の例のように簡単に定義できます。
一方 Ruby の場合、メソッドはクラスで定義されるものですので、オブジェクト
固有のメソッドを定義する場合でも、そのメソッドをどこかのクラスの中で
定義する必要があります。 その 「どこかのクラス」 が特異クラスです。

まとめると、オブジェクトそのものにメソッドを持たせることができるならば
特異クラスは不要ですが、Ruby の思想として 「メソッドはクラスで定義される」
ものなので、特異クラスというものが必要となる、ということになります。
そんな感じで私は理解しています。

-- 
信岡 ゆう (NOBUOKA Yu)
http://www.vividcode.info/

In This Thread