Frage
Kennt jemand eine Möglichkeit der Bereitstellung von Passthrough-Verfahren etwa wie folgt liefern jedoch mit Zusatz von DRY?
class Cover
@some_class = SomeClass.new
def some_method
@some_class.some_method
end
end
idealerweise würde Ich mag es so etwas auszutrocknen:
class Cover
@some_class = SomeClass.new
passthrough @some_class.some_method
end
ohne Affen Patchen das Leben aus mir ist es etwas, die Menschen haben?
Cheers,
Roja
Lösung
Forwadable ist wahrscheinlich das, was Sie wollen:
class Cover
extend Forwardable
def initialize
@some_class = SomeClass.new
end
def_delegator @some_class, :some_method
end
weiterleitbares Arbeiten auf Klassenebene, aber Sie können auch SingleForwardable für Objektebene Delegation verwenden.
Andere Tipps
für die Delegation Muster
Delegieren
Hat der Delegate Hilfe hier? Es ermöglicht Ihnen, Methoden zu einer zweiten Klasse zu delegieren
Diese Bibliothek bietet drei verschiedene Arten Methodenaufrufe auf ein Objekt zu übertragen. Die am einfachsten zu bedienen ist SimpleDelegator. Übergeben eines Gegenstandes an den Konstruktor und alle durch das Objekt unterstützt Methoden delegiert werden. Diese Aufgabe kann später geändert werden.
Möchten Sie einen Schritt weiter, ermöglicht es die Top-Level-DelegateClass Methode Sie leicht Setup Delegation durch Klassenvererbung. Dies ist wesentlich flexibler und somit wahrscheinlich die häufigste Verwendung für diese Bibliothek.
Schließlich, wenn Sie die volle Kontrolle über die Delegation Schema benötigen, können Sie von der abstrakten Klasse Delegator und fertigen Sie erben je nach Bedarf. (Wenn Sie sich um diese Steuerung zu finden, haben einen Blick auf weiterleitbares, auch in der Standardbibliothek. Es kann besser Ihre Bedürfnisse.)
weiterleitbares
Es gibt auch die weiterleitbares Bibliothek
Diese Bibliothek ermöglicht es Ihnen, Methodenaufrufe auf ein Objekt zu übertragen, auf einem Verfahren nach der Methode Basis. Sie können auf der Klassenebene diese Delegation weiterleitbares Setup verwenden oder SingleForwardable es auf der Objektebene zu behandeln.
Zwei Wege, ein reiner Rubin, ein Rails.
Rubin: def_delegator von weiterleitbares http://ruby-doc.org/stdlib/libdoc/ weiterleitbares / rdoc / classes / Forwardable.html
Rails: delegieren http://api.rubyonrails.org/classes/Module.html#M000110
Sie können die method_missing
Kernel außer Kraft setzen wie folgt:
class Bar
def method_missing(method, *args)
@delegate.send(method, *args) if @delegate.respond_to? method
end
end