如何使用Forwardable模块将类方法委托给Ruby中的另一个对象?

如何使用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

我想将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
  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