显式接收器的受保护方法错误(Ruby 1.9.3)

时间:2013-01-01 21:47:16

标签: ruby

在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)

1 个答案:

答案 0 :(得分:3)

受保护的方法可用于同一类或子类的其他实例的实例方法。但是,抛出错误的explicit_receiver是类的单例方法(实际上是元类)本身,并且无法访问类的受保护实例方法。

您只需运行以下内容即可看到:

class Foo
  def self.test
    Foo.new.protected_method
  end
end

Foo.test

你会得到类似的错误。

在这种情况下令人困惑的是,您在所创建的实例上调用tap并仍然出现此错误。这是因为tap块的绑定仍然在无法访问其类的受保护实例方法的元类的上下文中 - 您可以检查该块内的self以查看此内容。 / p>

相关问题