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クラスのオブジェクトの特異メソッド
と言える。
よって
クラスメソッドは、実際には特異メソッドである