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
関連書籍