プログラミングはできるが、その仕組みはよくわからない」という中級者へ向けて書いています。Ruby』が鉄板で、あとは実際に使いながらリファレンスマニュアルをなるべく参照するといいですよ」と答えます。コードを読み書きし始めた人が、決まって「あれ?」と立ち止まるところがあります。リファレンスマニュアルへの参照など、より深く学ぶためのリンクもありますので、記事を読んでその仕組みに興味をもった人が理解を深めるきっかけになってくれれば執筆者冥利につきます。endendという表記に出会うことがあります。特異クラスと言いまして、説明をすると大変長いものです。なにをしているかというと、これはクラスメソッドを定義するイディオムのひとつです。マニュアルにも記載があります。クラスメソッドの定義の特異クラス方式と書かれている箇所です。クラスメソッドの定義の仕方には大きくわけて二つのやり方があります。一つは特異メソッド方式、もう一つが特異クラス方式です。ようにメソッド名の前にクラスメソッドを定義する対象のクラス名をつけて定義します。書くことが多いでしょう。ようにクラス名を書かずにインスタンスメソッドと同じようなメソッド定義を書いていきます。この間に書いたものはクラスメソッドとして定義されます。書くのが面倒なため、そのようなときは特異クラス方式がとられることが多いようです。使う上で困ることは少ないでしょう。特異クラス方式についてだけ、少し説明を補足します。コードの例を見てみましょう。endendリファレンスマニュアルでの特異クラスの説明くらいは読んでみてもいいかもしれません。実はこれだけではわかったようでなにもわかっていません。メタクラス階層あたりを読むのがよさそうです。Ruby」あたりの解説を読んでみるといいでしょう。よるクラスメソッドの読み込みへ大部分が変わっていました。おかげでコードの見通しが非常によくなっています。これは学ぶべき点が多いですね。利用するための説明はここまでで終わりです。ここからは、実際に特異クラスやメタクラスを実感するために順を追って動きを見てみましょう。オブジェクトに対して直接固有のメソッドを定義することができ、それを特異メソッドと呼んでいます。オブジェクトへ特異メソッドを定義するには下記のようにします。クラスが拡張されたわけではありません。形式オブジェクトに特異メソッドを定義するにはもう一つ方法があり、オブジェクトの特異クラスをひきだして、直接特異メソッドを定義することができます。オブジェクトの特異クラスを引き出しており、あくまでオブジェクトに対しての特異メソッドの定義となっています。selfとしています。いうグローバルな定数へ代入しています。以下の二つはほぼ同義です。クラスを定義する場合。helloここまでくるともう少しです。クラスのオブジェクトへ特異メソッドを定義してみましょう。定義することになります。いう呼出しができました。これはクラスメソッドの呼出しと同じですね。クラスのオブジェクトへの特異メソッドの定義として読むことができます。あわせて考えると、最初のイディオムがやろうとしていることがわかってきます。クラスメソッドの定義は特異メソッド形式と特異クラス形式があったのでした。特異クラス形式へ書きかえてみます。記法での宣言の中に入れてみましょう。byeここでようやく最初に読んだ形が出てきました。クラスメソッドのための記法があるわけではなく、特異メソッドという仕組みを使って巧みにクラスメソッドが実現されていることがわかりますね。特異クラスと特異メソッドの記法を使ってメタクラス2へアクセスし、クラスメソッドとして働くメソッド定義ができることを順に見てきました。ふだん何気なく使っているものや読んでいるコードの仕組みを調べるおもしろさが少しでも伝わったなら、この記事の目論みは成功です。(先日ひさしぶりに参加した)。仕事が多くなってきたプログラマ。↩メタクラスという呼び方はあえて説明の中では使いませんでした。さんの記事では説明されているので気になる方はぜひそちらの説明を参照してみてください。