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

支持委托模式


代表


代表在这里 有帮助吗?它允许您将方法委托给第二个类

该库提供了三种不同的方法来将方法调用委托给对象。最容易使用的是 SimpleDelegator。将对象传递给构造函数,该对象支持的所有方法都将被委托。以后可以更改此对象。

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

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


可转发


还有可转发的库

该库允许您将方法调用委托给一个对象,一个方法一个方法的基础上。您可以使用 Forwardable 在类级别设置此委托,或使用 SingleForwardable 在对象级别处理它。

于 2010-02-09T16:31:50.097 回答
2

Forwadable可能是您想要的:

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

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

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

Rails:委托 http://api.rubyonrails.org/classes/Module.html#M000110

于 2010-02-10T06:01:15.873 回答
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 回答