使def_delegator尊重私有方法

时间:2013-09-17 01:06:25

标签: ruby metaprogramming access-specifier

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

在以下代码中,当使用def_delegator时,即使Foo#hello是私有的,也会调用Forwardable#def_delegator,因为def_instance_delegator(实际上,__send__)的实现使用{{ 1}},不尊重私有方法。

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。

1 个答案:

答案 0 :(得分: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