modul SingleForwardable
SingleForwardable kann verwendet werden, um Delegation auch auf Objektebene einzurichten.
printer = String.new printer.extend SingleForwardable # prepare object for delegation printer.def_delegator "STDOUT", "puts" # add delegation for STDOUT.puts() printer.puts "Howdy!"
Darüber hinaus kann SingleForwardable verwendet werden, um Delegation für eine Klasse oder ein Modul einzurichten.
class Implementation def self.service puts "serviced!" end end module Facade extend SingleForwardable def_delegator :Implementation, :service end Facade.service #=> serviced!
Wenn Sie sowohl Forwardable als auch SingleForwardable verwenden möchten, können Sie die Methoden def_instance_delegator und def_single_delegator usw. verwenden.
Öffentliche Instanzmethoden
Source
# File lib/forwardable.rb, line 305 def def_single_delegator(accessor, method, ali = method) gen = Forwardable._delegator_method(self, accessor, method, ali) instance_eval(&gen) end
Definiert eine Methode method, die an accessor delegiert (d. h. sie ruft die Methode mit demselben Namen in accessor auf). Wenn new_name angegeben ist, wird es als Name für die Delegationsmethode verwendet. Gibt den Namen der definierten Methode zurück.
Source
# File lib/forwardable.rb, line 291 def def_single_delegators(accessor, *methods) methods.each do |method| next if /\A__(?:send|id)__\z/ =~ method def_single_delegator(accessor, method) end end
Abkürzung für die Definition mehrerer Delegationsmethoden, jedoch ohne die Möglichkeit, einen anderen Namen zu verwenden. Die folgenden beiden Codebeispiele haben die gleiche Wirkung
def_delegators :@records, :size, :<<, :map def_delegator :@records, :size def_delegator :@records, :<< def_delegator :@records, :map
Source
# File lib/forwardable.rb, line 270 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