модуль 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 или Module.
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–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.