在ruby 1.9.3中,为什么Foo.explicit_receiver
会产生一个“受保护的方法”错误?
我正在引用这些教程:
哪个州:
您总是可以使用隐式接收器调用受保护的方法 像private一样,但另外你可以调用一个受保护的方法 只要这个接收器是自我的或者是一个对象的显式接收器 与自我同一类。
我用Foo
实例调用protected,这应该允许我调用protected方法。我肯定错过了一些东西:)
代码示例
class Foo
def implicit_receiver
protected_method
end
def explicit_receiver
self.protected_method
end
def self.explicit_receiver
Foo.new.tap do |foo|
foo.protected_method
end
end
protected
def protected_method
p "called protected method!"
end
end
foo = Foo.new
foo.implicit_receiver
foo.explicit_receiver
Foo.explicit_receiver
# output
# "called protected method!"
# "called protected method!"
# protected.rb:12:in `explicit_receiver': protected method `protected_method' called for #<Foo:0x10a280978> (NoMethodError)
答案 0 :(得分:3)
受保护的方法可用于同一类或子类的其他实例的实例方法。但是,抛出错误的explicit_receiver
是类的单例方法(实际上是元类)本身,并且无法访问类的受保护实例方法。
您只需运行以下内容即可看到:
class Foo
def self.test
Foo.new.protected_method
end
end
Foo.test
你会得到类似的错误。
在这种情况下令人困惑的是,您在所创建的实例上调用tap
并仍然出现此错误。这是因为tap
块的绑定仍然在无法访问其类的受保护实例方法的元类的上下文中 - 您可以检查该块内的self
以查看此内容。 / p>