Ruby/Rubyの基礎知識

Rubyの特異クラス・特異メソッドについて(2ページ目)

特定のオブジェクトに紐づく特殊なクラス「特異クラス」と、特異クラスに定義されるメソッド「特異メソッド」を知ることで、Rubyのオブジェクト指向設計の理解を深めます。

橋本 拓也

執筆者:橋本 拓也

Rubyガイド

特異クラスへのアクセス

先述のように、すべてのオブジェクトは自身の特異クラスを持ちます。この特異クラスを拡張 (例えばインスタンスメソッドを追加するなど) したいときはどうすれば良いでしょうか。 特異クラスには名前が与えられていないため、普通のクラスのように class 特異クラス名 ... end という構文でアクセスすることは出来ません。

その代わりに使うのが、 class << オブジェクトA ... end という構文です。<< で開いたスコープ内部では、コンテキストがオブジェクトAの特異クラスへと切り替わっています。

def obj.hi で定義しても、上記のように<<で特異クラスを開いてメソッドを定義しても、結果は同じです。

クラスはオブジェクトである

ここで少し余談として、Rubyが「クラス」をどう扱っているか復習します。

Rubyにおいて、(ほぼ)すべてはオブジェクトです。クラスも例外ではなく、オブジェクトです。正確に言うと "Class" という名前のクラスが上位に存在し、StringやArrayやIntegerといったクラス、また自身で定義したHogeクラスなども、すべて"Class"クラスのインスタンスとして生成されます。

クラスもオブジェクトであるということは、もちろん特異クラスを持っているはずです。<<でオープンし、特異メソッドを追加することが出来ます。

最後の String.shout は特異クラスの呼び出しですが、クラスメソッドの呼び出しのように見えます。事実、クラスメソッドと呼ばれているものは特異メソッドの一種です。

クラスメソッドは特異メソッドの一種である

特異クラス・特異メソッドの知識を得たうえでRubyのクラスメソッド定義を見てみます。

クラス定義中にclass << self ... endと書くのはクラスメソッドを定義する際によく使われるイディオムで、def self.method_name としても結果は同じです。

以上

以上で特異クラス・特異メソッドの説明は終わりです。

【編集部おすすめの購入サイト】
Amazonで Ruby 関連の書籍をチェック!楽天市場で Ruby 関連の書籍をチェック!
  • 前のページへ
  • 1
  • 2
※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます