如何使用Forwardable模块将类方法委托给Ruby中的另一个对象?
我想将Bar上的类方法委托给Foo类的一个实例,但我无法使委托生效。没有一个委托方法抛出错误,getter只返回nil。我的代码是这样的:如何使用Forwardable模块将类方法委托给Ruby中的另一个对象?,ruby,Ruby,我想将Bar上的类方法委托给Foo类的一个实例,但我无法使委托生效。没有一个委托方法抛出错误,getter只返回nil。我的代码是这样的: class Foo attr_reader :worksheet_id, :access_token def configure worksheet_id: raise, access_token: raise @worksheet_id = worksheet_id @access_token = access_token e
class Foo
attr_reader :worksheet_id, :access_token
def configure worksheet_id: raise, access_token: raise
@worksheet_id = worksheet_id
@access_token = access_token
end
end
class Bar
class << self
extend Forwardable
def_delegators Foo.new, :configure, :worksheet_id, :access_token
end
configure worksheet_id: 1, access_token: 2
end
我做错了什么?方法族的
def_delegator
的第一个参数是符号或字符串(或实现to_s
的任何其他参数),表示访问委托目标的“访问器”。这不是授权目标本身
所以,像这样的方法会奏效:
class Bar
class << self
extend Forwardable
def_delegators :@foo, :configure, :worksheet_id, :access_token
end
@foo = Foo.new
configure worksheet_id: 1, access_token: 2
end
Bar.worksheet_id # => 1
Bar.access_token # => 2
因此,您可以将任何内容作为target
传递,其传递给
会产生一些结果,您可以评估
,然后调用\uu发送
。但是,在您的例子中,Foo.new.to_s
类似于
。当插入字符串和eval
d时,该行以#
字符开头,或者简单地说:转发器方法由注释掉的单行组成!这就是为什么它返回nil
,因为这是空方法返回的。def_delegator
方法族的第一个参数是一个符号或字符串(或实现to_s
)表示访问委托目标的“访问器”。这不是授权目标本身
所以,像这样的方法会奏效:
class Bar
class << self
extend Forwardable
def_delegators :@foo, :configure, :worksheet_id, :access_token
end
@foo = Foo.new
configure worksheet_id: 1, access_token: 2
end
Bar.worksheet_id # => 1
Bar.access_token # => 2
因此,您可以将任何内容作为target
传递,其传递给
会产生一些结果,您可以评估
,然后调用\uu发送
。但是,在您的例子中,Foo.new.to_s
类似于
。当插入字符串和eval
d时,该行以#
字符开头,或者简单地说:转发器方法由注释掉的单行组成!这就是为什么它返回nil
,因为这是空方法返回的。def_delegator
方法族的第一个参数是一个符号或字符串(或实现to_s
)表示访问委托目标的“访问器”。这不是授权目标本身
所以,像这样的方法会奏效:
class Bar
class << self
extend Forwardable
def_delegators :@foo, :configure, :worksheet_id, :access_token
end
@foo = Foo.new
configure worksheet_id: 1, access_token: 2
end
Bar.worksheet_id # => 1
Bar.access_token # => 2
因此,您可以将任何内容作为target
传递,其传递给
会产生一些结果,您可以评估
,然后调用\uu发送
。但是,在您的例子中,Foo.new.to_s
类似于
。当插入字符串和eval
d时,该行以#
字符开头,或者简单地说:转发器方法由注释掉的单行组成!这就是为什么它返回nil
,因为这是空方法返回的。def_delegator
方法族的第一个参数是一个符号或字符串(或实现to_s
)表示访问委托目标的“访问器”。这不是授权目标本身
所以,像这样的方法会奏效:
class Bar
class << self
extend Forwardable
def_delegators :@foo, :configure, :worksheet_id, :access_token
end
@foo = Foo.new
configure worksheet_id: 1, access_token: 2
end
Bar.worksheet_id # => 1
Bar.access_token # => 2
因此,您可以将任何内容作为target
传递,其传递给
会产生一些结果,您可以评估
,然后调用\uu发送
。但是,在您的例子中,Foo.new.to_s
类似于
。当插入字符串和eval
d时,该行以#
字符开头,或者简单地说:转发器方法由注释掉的单行组成!这就是为什么它返回nil
,因为这就是空方法返回的结果。你想做什么?最后的测试描述了应该发生什么。我将在问题中更清楚地说明这一点。请参见此处http://ruby-doc.org//stdlib-2.0/libdoc/forwardable/rdoc/Forwardable.html
。此外,您的类/实例范围似乎也有问题。我建议你描述一下你试图解决的问题(不是技术部分)。你想做什么?最后的测试描述了应该发生什么。我将在问题中更清楚地说明这一点。请参见此处http://ruby-doc.org//stdlib-2.0/libdoc/forwardable/rdoc/Forwardable.html
。此外,您的类/实例范围似乎也有问题。我建议你描述一下你试图解决的问题(不是技术部分)。你想做什么?最后的测试描述了应该发生什么。我将在问题中更清楚地说明这一点。请参见此处http://ruby-doc.org//stdlib-2.0/libdoc/forwardable/rdoc/Forwardable.html
。此外,您的类/实例范围似乎也有问题。我建议你描述一下你试图解决的问题(不是技术部分)。你想做什么?最后的测试描述了应该发生什么。我将在问题中更清楚地说明这一点。请参见此处http://ruby-doc.org//stdlib-2.0/libdoc/forwardable/rdoc/Forwardable.html
。此外,您的类/实例范围似乎也有问题。我建议你多描述一下你试图解决的问题(而不是技术部分)。嗨,Jorg,你为什么要用Forwardable
扩展元类,而不仅仅是扩展类本身呢?@Jonah:因为这就是问题所在。OP想要转发singleton类的方法,而不是该类的方法。嗨Jorg,你为什么要用Forwardable
扩展元类,而不仅仅是扩展类本身呢?@Jonah:因为这就是问题所在。OP想要转发singleton类的方法,而不是该类的方法。嗨Jorg,你为什么要用Forwardable
扩展元类,而不仅仅是扩展类本身呢?@Jonah:因为这就是问题所在。OP wa