我可以使用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 (即它在访问者中调用相同名称的方法)。

正如您所看到的,这不是传递常量的值,而是传递一个与常量同名的方法。 如果要传递与常量相同的值,可以提供一个访问器方法,该方法返回原始常量的值,以便您可以在此类中指定它。