модуль SingleForwardable
SingleForwardable можно использовать для настройки делегирования на уровне объекта.
printer = String.new printer.extend SingleForwardable # prepare object for delegation printer.def_delegator "STDOUT", "puts" # add delegation for STDOUT.puts() printer.puts "Howdy!"
Кроме того, SingleForwardable можно использовать для настройки делегирования для класса или модуля.
class Implementation
def self.service
puts "serviced!"
end
end
module Facade
extend SingleForwardable
def_delegator :Implementation, :service
end
Facade.service #=> serviced!
Если вы хотите использовать и Forwardable, и SingleForwardable, можно использовать методы def_instance_delegator и def_single_delegator и т. д.
Открытые методы экземпляра
# File lib/forwardable.rb, line 310 def def_single_delegator(accessor, method, ali = method) gen = Forwardable._delegator_method(self, accessor, method, ali) ret = instance_eval(&gen) singleton_class.__send__(:ruby2_keywords, ali) if RUBY_VERSION >= '2.7' ret end
Определяет метод method, который делегирует вызов accessor (то есть вызывает метод с таким же именем у accessor). Если указано значение new_name, оно используется в качестве имени делегирующего метода. Возвращает имя определённого метода.
# File lib/forwardable.rb, line 296
def def_single_delegators(accessor, *methods)
methods.each do |method|
next if /\A__(?:send|id)__\z/ =~ method
def_single_delegator(accessor, method)
end
end Сокращённая форма для определения нескольких методов-делегатов, не позволяющая использовать другое имя. Следующие два фрагмента кода дают одинаковый результат:
def_delegators :@records, :size, :<<, :map def_delegator :@records, :size def_delegator :@records, :<< def_delegator :@records, :map
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.