5

班上

class A

  private
  def foo
    puts :foo
  end

  public
  def bar
    puts :bar
  end

  private
  def zim
    puts :zim
  end

  protected
  def dib
    puts :dib
  end
end

A的实例

a = A.new

测试

a.foo rescue puts :fail
a.bar rescue puts :fail
a.zim rescue puts :fail
a.dib rescue puts :fail
a.gaz rescue puts :fail

测试输出

fail
bar
fail
fail
fail

.发送测试

[:foo, :bar, :zim, :dib, :gaz].each { |m| a.send(m) rescue puts :fail }

.发送输出

foo
bar
zim
dib
fail

问题

标有“测试输出”的部分是预期结果。那么为什么我可以简单地访问私有/受保护的方法Object#send呢?

也许更重要的是:

Ruby中的public/ private/有什么区别?protected什么时候使用每个?有人可以提供真实世界的示例privateprotected用法吗?

4

1 回答 1

8

从技术上讲:因为send不做任何检查方法可见性的事情。(这样做会做更多的工作。)

哲学上:Ruby 是一种非常宽松的语言。您已经可以打开一个类并公开您想要的任何方法。语言设计者send以一种允许其覆盖通常由private. Ruby 1.9 最初将有两个变体,一个private-respectingsend和一个不安全的变体,称为send!,但显然为了向后兼容而放弃了。

至于什么和private意思:protectedpublic

  • public方法可以被任何发送者调用
  • protected方法不能在方法类的实例或子类的实例之外调用
  • private方法不能用显式接收器调用(有几个例外,例如 setter 方法,它们总是必须有一个显式接收器,因此可以在类中以这种方式调用)
于 2010-03-25T20:39:53.107 回答