我可以使用Forwardable在Ruby中委托一个常量吗?
鉴于以下类:
class Thing CONSTANT = 10 # other code end
而另一个像:
class Other def initialize @thing = Thing.new end def method puts CONSTANT end end
是否有可能将Forwardable
扩展到拥有Other
CONSTANT
委托给Thing
的常数?
我试过像这样扩展SingleForwardable
(参见这里的文档):
class Other extend SingleForwardable def initialize @thing = Thing.new end def method puts CONSTANT end def_single_delegator :@thing, :CONSTANT end
和:
def_single_delegator :@thing, :constant
但是没有用,我的语法错了吗? 如果没有,还有另一种方式吗?
文档回答了这一点( 大胆强调我的) :
def_single_delegator(accessor, method, new_name=method)
定义一个委托给访问器的方法 方法 (即它在访问器中 调用相同名称的方法 )。 如果提供了new_name ,则将其用作委托方法的名称。
所以,不,你只能委派消息发送,而不是常量查找。
Forwardable(和SingleForwardable)允许您通过模块将类函数添加到当前类。 编写委托人时,您将指定从原始模块传递给接收对象的方法。
在您的示例中, def_single_delegator :@thing, :CONSTANT
被解释为以下内容:定义一个方法:CONSTANT
,它委托给访问者:@thing
(即它在访问者中调用相同名称的方法)。
正如您所看到的,这不是传递常量的值,而是传递一个与常量同名的方法。 如果要传递与常量相同的值,可以提供一个访问器方法,该方法返回原始常量的值,以便您可以在此类中指定它。