我可以使用Forwardable在Ruby中委托一个常量吗?

时间:2017-01-11 15:22:57

标签: ruby delegates constants

给定一个类:

EXEC prInsertPrice 'N01', 20000, @date, null

另一个像:

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(请参阅文档here),如下所示:

SingleForwardable

class Other
  extend SingleForwardable

  def initialize
    @thing = Thing.new
  end

  def method
    puts CONSTANT
  end

  def_single_delegator :@thing, :CONSTANT
end

但是没有用,我的语法错了吗?如果没有,还有另一种方式吗?

2 个答案:

答案 0 :(得分:1)

Forwardable(和SingleForwardable)允许您通过模块向当前类添加类函数。编写委托人时,您需要指定从原始模块传递给接收对象的方法。

在您的示例中,def_single_delegator :@thing, :CONSTANT被解释为以下内容:定义委托给访问者:CONSTANT的方法:@thing(即它在访问者中调用相同名称的方法)。

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

答案 1 :(得分:0)

这个问题由the documentation (bold emphasis mine)回答:

  

def_single_delegator(accessor, method, new_name=method)

     

定义方法 方法,该方法委派给访问者(即调用同名方法 存取)。如果提供了 new_name ,则将其用作委托方法的名称。

所以,不,你只能委派消息发送,而不是不断的查找。