Метод-одиночка (singleton method) — это метод, определенный для конкретного экземпляра объекта, а не для всего класса. Такой метод существует только у одного объекта и не доступен другим экземплярам того же класса.
str = "hello"
def str.uppercase
self.upcase
end
puts str.uppercase # => "HELLO"
puts "another string".uppercase # => NoMethodError
obj = Object.new
def obj.custom_method
"Специальный метод только для этого объекта"
end
class MyClass; end
class << MyClass
def class_method
"Метод класса"
end
end
obj = Object.new
obj.define_singleton_method(:dynamic) { "Динамически созданный метод" }
user = User.find(1)
def user.admin?
true
end
class MyClass
def self.class_method
"Это singleton-метод для класса MyClass"
end
end
test_user = User.new
def test_user.save
true # Заглушка для тестов
end
obj = Object.new
singleton_class = class << obj; self; end
puts singleton_class.ancestors # => [#<Class:#<Object:0x000...>>, Object, Kernel, BasicObject]
obj.singleton_methods # => список методов-одиночек
obj.respond_to?(:method_name) # => проверка наличия
report = Report.new
def report.export_to_pdf
PDFGenerator.generate(self)
end
# Только этот конкретный отчет получит метод export_to_pdf
service = Service.new
def service.timeout
30 # Уникальный таймаут для этого экземпляра
end
product = Product.find(123)
def product.price_with_discount
price * 0.9
end
singleton_class
- возвращает singleton-класс объектаdefine_singleton_method
- динамическое созданиеextend
- добавляет методы модуля как singleton-методыmodule Logging
def log
puts "Logging..."
end
end
obj = Object.new
obj.extend(Logging)
obj.log # => "Logging..."
Резюмируем: методы-одиночки в Ruby — это мощный механизм для добавления уникального поведения отдельным объектам без модификации их класса. Они широко используются для:
Понимание singleton-методов критически важно для глубокого освоения Ruby и его метапрограммных возможностей.