1

是否可以让Forwardable#def_delegator方法尊重目标方法是私有的?

在下面的代码中,使用 when 时def_delegatorFoo#hello即使它是私有的,也会被调用,因为Forwardable#def_delegator(实际上,def_instance_delegator) 的实现使用__send__,它不尊重私有方法。

require "forwardable"

class Foo
  def hello
    "Hello"
  end
  private :hello
end

class Bar
  extend Forwardable

  def_delegator :@foo, :hello

  def initialize
    @foo = Foo.new
  end

  def bar
    hello
  end
end

foo = Foo.new
foo.hello # => NoMethodError: private method `hello' called for #<Foo:0x007f57c3cd1c80>

bar = Bar.new
bar.bar # => "Hello"

我正在使用 Ruby 2.0。

4

1 回答 1

1

不是直接的。如果您使用的是 Active Support 核心扩展 4.0 或更高版本,则可以Module#delegate改用:

require "active_support/core_ext/module/delegation"

class Foo
  def hello
    "Hello"
  end
  private :hello
end

class Bar
  delegate :hello, :to => :@foo

  def initialize
    @foo = Foo.new
  end

  def bar
    hello
  end
end
于 2013-09-17T01:40:15.643 回答