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

War es hilfreich?

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

Unterstützen

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top