特異メソッドとクラスメソッド
Rubyの中でも特異メソッドは結構苦戦したので、ちょっとまとめて見る。
まずは普通のインスタンスメソッドの記述方法。
これは特に問題ない。
class Hoge def func print "test" end end hoge = Hoge.new hoge.func # => "test"
次は特異メソッド。
これは特定のオブジェクトだけが使えるメソッドを追加したいときに使う。
ただ、どうやら定義の仕方が2通りある。
1つ目は単純にオブジェクトにメソッドを定義する方法。
2つ目は特異クラスを再オープンしてメソッドを定義する方法。
1つ目
hoge = Hoge.new def hoge.func2 print "added function2" end hoge.func2 # => "added function2"
2つ目
hoge = Hoge.new class << hoge def func2 print "added function2" end end hoge.func2 # => "added function2"
そしてこの特異メソッドは、実はクラスにも適用できるみたい。
というのも、そもそもRubyではすべてのクラスはClassクラスから生成されたオブジェクトということになっているから、(このすべてのクラスはオブジェクトであるってところがポイント)クラスの場合もオブジェクトと同様に特異メソッドを指定していいってことになる。
ってことは、もともとクラスに定義されているメソッドもクラスの特異メソッドの一種とも言えるのかな。
たぶん。。
上記の「1つ目」と同じ方法
def Hoge.func3 print "added function3" end hoge.func3 # => "added function3"
上記の「2つ目」と同じ方法
class << Hoge def func3 print "added function3" end end Hoge.func3 # => "added function3"
Hogeをselfに変更しただけのもの
class << self def func3 print "added function3" end end Hoge.func3 # => "added function3"