"public"和"private"是类,而"protected"不是?


irb(main):001:0> public.class
=> Class
irb(main):002:0> private.class
=> Class

我很惊讶publicClassprivate也一样,让我继续我的测试:

irb(main):003:0> protected.class
NameError: undefined local variable or method `protected' for main:Object
        from (irb):3
        from D:/Ruby2.0.0/bin/irb:12:in `<main>'

呃,现在我更困惑了。所以我的问题是:

  1. publicprivate真的是阶级吗?
  2. 为什么protected不同?

问题 1 的答案是否定的,publicprivate 不是类,它们是模块上的方法,就像protected一样。不过,它们都返回self,在您的示例中是Class的实例。

2.1.2 :006 > defined? public
 => "method" 

至于为什么protected表现不同,我不知道。我怀疑它与顶级对象(main(及其行为方式有关。

例如,此代码:

class Foo
  puts public
  puts private
  puts protected
end

产生这个输出,protected没有错误:

Foo
Foo
Foo

至于它们真的是课程吗,我会与比我自己更有经验的人不同。

至于protected不同protected可以被类的任何实例或其子类使用,其中private不能用显式接收器调用。 private方法只能由类本身或其直接后代调用。 必须在调用对象的上下文中调用private方法。

这意味着如果我有 2 个对象(obj1obj2 (,它们都是同一Class的实例。 obj1可以调用protected obj2方法,因为它们属于同一类,但obj1不能调用private obj2方法,因为这些方法私下作用域为 obj2

我不确定这是否回答了您的问题,但我觉得从同一类的相同/子类的另一个实例调用这些方法的能力对它们实现方式不同的原因有深远的影响。

这是一个非常好的问题,我希望有人能对这些内容的真正实施进行更深入的解释。

最新更新