Rubyの特異クラス・特異メソッドについて

アプリケーション

概要

Rubyの特異クラスと特異メソッドについてかく。

特異クラス

特異クラスとは、特定のオブジェクトに対してのみ有効なクラスのことを指す。

class Greet
  def say_hi
    puts 'Hi'
  end
end

greet = Greet.new

# 特異クラス
class << greet
  # シングルトンメソッド
  def say_bye
    puts 'Bye'
  end
end

greet.say_hi # => Hi
greet.say_bye # => Bye
p greet.singleton_methods # => [:say_bye]
singleton_class = greet.singleton_class
puts singleton_class # => #<Class:#<Greet:0x00007f8b1b0>>

特異メソッド

特異メソッドとは、特定のオブジェクトに対してのみ有効なメソッドのことを指す。

class Greet
  def self.say_hi
    puts "Hi"
  end
end

Greet.say_hi # => Hi

obj = Greet.new

# シングルトンメソッド
def obj.say_bye
  puts "Bye"
end

obj.say_bye # => Bye
p obj.singleton_methods # => [:say_bye]

特異メソッドは特定のオブジェクトだけが持つメソッドであるため、そのオブジェクトに対してのみ有効である。

class Greet; end

obj1 = Greet.new
obj2 = Greet.new

def obj1.say_hi
  puts "Hi"
end

obj1.say_hi # Hiw
obj2.say_hi # NoMethodError

クラスメソッドは実質的に特異メソッドである。

class Greet
  # クラスメソッド定義
  class << self
    def say_hi
      puts "Hello"
    end
  end
end

puts Greet.say_hi

# クラス定義の外でクラスメソッドを定義することもできる
class Greet; end
class << Greet
  def say_hi
    puts "Hello"
  end
end

puts Greet.say_hi

# 次のようにクラスメソッドを定義することもできる
class Greet
  def self.say_hi
    puts "Hi"
  end
end

参考


関連書籍