是否可以使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。
答案 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