Ruby

特異メソッドとクラスメソッド

rubyの特異メソッドとクラスメソッド

クラスメソッドは、実際には特異メソッドである

Rubyの入門書を読んでいてこう書いてあった。
それぞれ調べてみた。

特異メソッド
特定のオブジェクトに対して、定義するメソッド。

クラスメソッド
オブジェクトではなく、クラスから呼び出されるメソッド。

違うものなのに一緒ってどういうことなんだろう?

rubyでは、ほとんどがオブジェクトである。

メソッドやブロックなど一部を除き、様々な値やクラスも含めてほとんどはオブジェクトである。下記を、見ればわかりやすい。
Objectクラスのclassメソッドは、さまざまなオブジェクトのクラスを調べることができる。

[1] pry(main)> 1.class
=> Fixnum
[2] pry(main)> "a".class
=> String
[3] pry(main)> [1,2].class
=> Array
[4] pry(main)> {:x => 1}.class
=> Hash
[5] pry(main)> true.class
=> TrueClass
[6] pry(main)> nil.class
=> NilClass


# それぞれのクラスもClassクラスのオブジェクト
[9] pry(main)> String.class
=> Class
[10] pry(main)> Fixnum.class
=> Class
[11] pry(main)> String.class
=> Class
[12] pry(main)> TrueClass.class
=> Class

上記を踏まえて、
クラスメソッドを定義してみる

class String
  def self.hoge
    # なんかしらの処理
  end
end

hogeメソッドを、Stringクラスのクラスメソッドとして定義した。
StringクラスもClassクラスのオブジェクトであれば、
hogeメソッドが、Classクラスのオブジェクトの特異メソッド
と言える。

よって

クラスメソッドは、実際には特異メソッドである