class Delegator
Diese Bibliothek bietet drei verschiedene Möglichkeiten, Methodenaufrufe an ein Objekt zu delegieren. Am einfachsten zu verwenden ist SimpleDelegator. Übergeben Sie ein Objekt an den Konstruktor und alle vom Objekt unterstützten Methoden werden delegiert. Dieses Objekt kann später geändert werden.
Einen Schritt weiter geht die übergeordnete Methode DelegateClass, mit der Sie die Delegation durch Klassenerbschaft einfach einrichten können. Dies ist erheblich flexibler und wahrscheinlich die häufigste Verwendung für diese Bibliothek.
Schließlich können Sie, wenn Sie die volle Kontrolle über das Delegationsschema benötigen, von der abstrakten Klasse Delegator erben und nach Bedarf anpassen. (Wenn Sie diese Kontrolle benötigen, werfen Sie einen Blick auf Forwardable, das sich ebenfalls in der Standardbibliothek befindet. Es kann Ihren Anforderungen besser entsprechen.)
Die Implementierung von SimpleDelegator dient als schönes Beispiel für die Verwendung von Delegator
require 'delegate' class SimpleDelegator < Delegator def __getobj__ @delegate_sd_obj # return object we are delegating to, required end def __setobj__(obj) @delegate_sd_obj = obj # change delegation object, # a feature we're providing end end
Hinweise
Seien Sie sich bewusst, dass RDoc keine delegierten Methoden erkennt.
Constants
- VERSION
-
Die Versionszeichenfolge
Öffentliche Klassenmethoden
Source
# File lib/delegate.rb, line 76 def initialize(obj) __setobj__(obj) end
Übergeben Sie obj, an das Methodenaufrufe delegiert werden sollen. Alle vom obj unterstützten Methoden werden delegiert.
Öffentliche Instanzmethoden
Source
# File lib/delegate.rb, line 165 def !=(obj) return false if obj.equal?(self) __getobj__ != obj end
Gibt true zurück, wenn zwei Objekte nicht als gleichwertig betrachtet werden.
Source
# File lib/delegate.rb, line 157 def ==(obj) return true if obj.equal?(self) self.__getobj__ == obj end
Gibt true zurück, wenn zwei Objekte als gleichwertig betrachtet werden.
Source
# File lib/delegate.rb, line 189 def __getobj__ __raise__ ::NotImplementedError, "need to define '__getobj__'" end
Diese Methode muss von Unterklassen überschrieben werden und sollte das Objekt zurückgeben, an das Methodenaufrufe delegiert werden.
Source
# File lib/delegate.rb, line 197 def __setobj__(obj) __raise__ ::NotImplementedError, "need to define '__setobj__'" end
Diese Methode muss von Unterklassen überschrieben werden und ändert das delegierte Objekt zu obj.
Source
# File lib/delegate.rb, line 173 def eql?(obj) return true if obj.equal?(self) obj.eql?(__getobj__) end
Gibt true zurück, wenn zwei Objekte als gleichwertig betrachtet werden.
Source
# File lib/delegate.rb, line 238 def freeze __getobj__.freeze super() end
:method: freeze Friert sowohl das von __getobj__ zurückgegebene Objekt als auch sich selbst ein.
Source
# File lib/delegate.rb, line 204 def marshal_dump ivars = instance_variables.reject {|var| /\A@delegate_/ =~ var} [ :__v2__, ivars, ivars.map {|var| instance_variable_get(var)}, __getobj__ ] end
Serialisierungsunterstützung für das von __getobj__ zurückgegebene Objekt.
Source
# File lib/delegate.rb, line 216 def marshal_load(data) version, vars, values, obj = data if version == :__v2__ vars.each_with_index {|var, i| instance_variable_set(var, values[i])} __setobj__(obj) else __setobj__(data) end end
Initialisiert die Delegation von einem serialisierten Objekt neu.
Source
# File lib/delegate.rb, line 83 def method_missing(m, *args, &block) r = true target = self.__getobj__ {r = false} if r && target_respond_to?(target, m, false) target.__send__(m, *args, &block) elsif ::Kernel.method_defined?(m) || ::Kernel.private_method_defined?(m) ::Kernel.instance_method(m).bind_call(self, *args, &block) else super(m, *args, &block) end end
BasicObject#method_missing aufSource
# File lib/delegate.rb, line 132 def methods(all=true) __getobj__.methods(all) | super end
Gibt die für dieses Delegations-Objekt verfügbaren Methoden als Vereinigung der Methoden dieses Objekts und von __getobj__ zurück.
Source
# File lib/delegate.rb, line 148 def protected_methods(all=true) __getobj__.protected_methods(all) | super end
Gibt die für dieses Delegations-Objekt verfügbaren geschützten Methoden als Vereinigung der geschützten Methoden dieses Objekts und von __getobj__ zurück.
Source
# File lib/delegate.rb, line 140 def public_methods(all=true) __getobj__.public_methods(all) | super end
Gibt die für dieses Delegations-Objekt verfügbaren öffentlichen Methoden als Vereinigung der öffentlichen Methoden dieses Objekts und von __getobj__ zurück.
Source
# File lib/delegate.rb, line 67
Verwenden Sie __raise__, wenn Ihr Delegator kein Objekt hat, an das der Methodenaufruf raise delegiert werden kann.
Source
# File lib/delegate.rb, line 100 def respond_to_missing?(m, include_private) r = true target = self.__getobj__ {r = false} r &&= target_respond_to?(target, m, include_private) if r && include_private && !target_respond_to?(target, m, false) warn "delegator does not forward private method \##{m}", uplevel: 3 return false end r end
Prüft auf eine vom Delegations-Objekt bereitgestellte Methode, indem der Aufruf über __getobj__ weitergeleitet wird.
Private Instanzmethoden
Source
# File lib/delegate.rb, line 115 def target_respond_to?(target, m, include_private) case target when Object target.respond_to?(m, include_private) else if KERNEL_RESPOND_TO.bind_call(target, :respond_to?) target.respond_to?(m, include_private) else KERNEL_RESPOND_TO.bind_call(target, m, include_private) end end end
Behandelt BasicObject-Instanzen