Spec-Zone.ru › Ruby 2.4

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

Методы публичного интерфейса

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 298
def def_single_delegator(accessor, method, ali = method)
  gen = Forwardable._delegator_method(self, accessor, method, ali)

  instance_eval(&gen)
end

Определяет метод method, который делегирует вызов в accessor (т.е. вызывает метод с тем же именем в accessor). Если new_name указан, он используется в качестве имени метода делегата.

Также алиасирован как: def_delegator
def_single_delegators(accessor, *methods) Показать исходный код
# File lib/forwardable.rb, line 284
def def_single_delegators(accessor, *methods)
  methods.delete("__send__")
  methods.delete("__id__")
  for method in methods
    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(hash)
Псевдоним для: single_delegate
delegate method → accessor Показать исходный код
delegate [method, method, ...] → accessor
# File lib/forwardable.rb, line 263
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

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

Также алиасирован как: delegate

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

Spec-Zone.ru

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