特異メソッド

特定のオブジェクトにだけ紐づくメソッドのことを特異メソッド(singleton method)と呼ぶ。 例えば、以下のような事例。

nakata = "私は中田"
suzuki = "私は鈴木"

def nakata.show
   puts "これは特異メソッドです"
end

nakata.show
=> これは特異メソッドです

suzuki.show
 => NoMethodError: undefined method `show' for "私は鈴木":String

nakata.showのようにオブジェクト.メソッド名という形で定義している。これによって、nakataというオブジェクトにshowメソッドが追加されることになる。これにより、nakataはshowメソッドが使えるが、suzukiは使えない。

また、数値やシンボルの2つだけには、Rubyの実装上、特異メソッドを定義できない。

number = 1

def number.fire
  "fire"
end
=> "TypeError: can't define singleton"
 
symbol = :line

def symbol.get
  "get"
end
 => "TypeError: can't define singleton"


クラスメソッドも実は特異メソッドの一種である。特定のクラスの特異メソッドということである。以下のコードを見ると、形は確かに似てる。

class User
end

# クラス構文の外部でクラスメソッドの定義
def User.hello
  "Hello"
end

User.hello
=> "Hello"