2

次のようなものを提供するためにパススルーメソッドを提供する方法を知っている人はいますが、DRYが追加されていますか?

class Cover

  @some_class = SomeClass.new

  def some_method
    @some_class.some_method
  end

end

理想的には、次のようなものに乾かしたいと思います。

class Cover

  @some_class = SomeClass.new
  passthrough @some_class.some_method

end

モンキーパッチを使わずに自分の人生にパッチを当てることなく、人々が持っているものはありますか?

乾杯、

ロジャ

4

4 に答える 4

8

委任パターンのサポート


デリゲート


デリゲート はここで役に立ちますか? メソッドを2番目のクラスに委任できます

このライブラリは、メソッド呼び出しをオブジェクトに委譲する 3 つの異なる方法を提供します。最も使いやすいのは SimpleDelegator です。オブジェクトをコンストラクターに渡すと、オブジェクトがサポートするすべてのメソッドが委任されます。このオブジェクトは後で変更できます。

さらに一歩進んで、最上位の DelegateClass メソッドを使用すると、クラスの継承を通じて委任を簡単に設定できます。これはかなり柔軟性が高いため、おそらくこのライブラリの最も一般的な用途です。

最後に、委任スキームを完全に制御する必要がある場合は、抽象クラス Delegator から継承し、必要に応じてカスタマイズできます。(このコントロールが必要な場合は、標準ライブラリにもある forwardable を参照してください。ニーズにより適している場合があります。)


転送可能


転送可能なライブラリ もあります

このライブラリを使用すると、メソッドごとにメソッド呼び出しをオブジェクトに委譲できます。Forwardable を使用してこの委譲をクラス レベルでセットアップするか、SingleForwardable を使用してオブジェクト レベルで処理することができます。

于 2010-02-09T16:31:50.097 に答える
2

フォワード可能はおそらくあなたが望むものです:

class Cover
  extend Forwardable

  def initialize
     @some_class = SomeClass.new
  end

  def_delegator @some_class, :some_method

end

Forwardable はクラス レベルで機能しますが、SingleForwardable をオブジェクト レベルの委任に使用す​​ることもできます。

于 2010-02-09T18:23:31.650 に答える
0

method_missing次のようにカーネルをオーバーライドできます。

class Bar
  def method_missing(method, *args)
    @delegate.send(method, *args) if @delegate.respond_to? method
  end
end
于 2010-02-10T06:28:35.260 に答える
0

1 つは純粋な Ruby、もう 1 つは Rails です。

Ruby: Forwardable の def_delegator http://ruby-doc.org/stdlib/libdoc/forwardable/rdoc/classes/Forwardable.html

Rails: デリゲート http://api.rubyonrails.org/classes/Module.html#M000110

于 2010-02-10T06:01:15.873 に答える