是否有人知道提供传递方法的方法,以提供类似以下内容但添加了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的
答案 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