技術開発日記

技術やら日々思ったことを綴ってます。

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

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"