直通方法

时间:2010-02-09 16:26:26

标签: ruby methods call

是否有人知道提供传递方法的方法,以提供类似以下内容但添加了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
没有猴子修补自己的生命是否有人有?

干杯,

Roja的

4 个答案:

答案 0 :(得分:8)

支持委托模式


代表


Delegate有帮助吗?它允许您将方法委托给第二个类

  

此库提供了三种不同的方法来将方法调用委托给对象。最简单易用的是SimpleDelegator。将对象传递给构造函数,并且将委派对象支持的所有方法。此对象可以在以后更改。

     

更进一步,顶级DelegateClass方法允许您通过类继承轻松设置委派。这是非常灵活的,因此可能是该库的最常见用途。

     

最后,如果您需要完全控制委派方案,则可以从抽象类Delegator继承并根据需要进行自定义。 (如果您发现自己需要这种控制,请查看可转发的,也可以在标准库中。它可能更适合您的需求。)


可转发


还有forwardable

  

此库允许您逐个方法地将方法调用委托给对象。您可以使用Forwardable在类级别设置此委派,或使用SingleForwardable在对象级别处理它。

答案 1 :(得分:2)

Forwadable可能就是你想要的:

class Cover
  extend Forwardable

  def initialize
     @some_class = SomeClass.new
  end

  def_delegator @some_class, :some_method

end

可转发在类级别上工作,但您也可以使用SingleForwardable进行对象级别委派。

答案 2 :(得分:0)

两种方式,一种是纯红宝石,一种是Rails。

红宝石: 来自Forwardable的def_delegator http://ruby-doc.org/stdlib/libdoc/forwardable/rdoc/classes/Forwardable.html

滑轨: 代表 http://api.rubyonrails.org/classes/Module.html#M000110

答案 3 :(得分:0)

您可以像这样覆盖内核的method_missing

class Bar
  def method_missing(method, *args)
    @delegate.send(method, *args) if @delegate.respond_to? method
  end
end