Spec-Zone.ru › Ruby 3.2

модуль 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 и т.д.

Публичные методы экземпляра

def_delegator(accessor, method, ali = method)
Псевдоним для: def_single_delegator
def_delegators(accessor, *methods)
Псевдоним для: def_single_delegators
def_single_delegator(accessor, method, new_name=method) Показать исходный код
# 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, оно используется как имя делегируемого метода. Возвращает имя определенного метода.

Также псевдоним: def_delegator
def_single_delegators(accessor, *methods) Показать исходный код
# 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
Также псевдоним: def_delegators
delegate method → accessor
delegate [method, method, ...] → accessor
Псевдоним для: single_delegate
single_delegate [method, method, ...] => accessor Показать исходный код
# File lib/forwardable.rb, line 275
def single_delegate(hash)
  hash.each do |methods, accessor|
    unless defined?(methods.each)
      def_single_delegator(accessor, methods)
    else
      methods.each {|method| def_single_delegator(accessor, method)}
    end
  end
end

Принимает в качестве аргумента хеш. Ключ – символ или массив символов. Эти символы соответствуют именам методов. Значение – accessor, к которому будут делегированы методы.

Также псевдоним: delegate

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API