irb(main):001:0> public.class
=> Class
irb(main):002:0> private.class
=> Class
我很惊讶public
类Class
,private
也一样,让我继续我的测试:
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>'
呃,现在我更困惑了。所以我的问题是:
public
和private
真的是阶级吗?- 为什么
protected
不同?
问题 1 的答案是否定的,public
和 private
不是类,它们是模块上的方法,就像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 个对象(obj1
和 obj2
(,它们都是同一Class
的实例。 obj1
可以调用protected
obj2
方法,因为它们属于同一类,但obj1
不能调用private
obj2
方法,因为这些方法私下作用域为 obj2
。
我不确定这是否回答了您的问题,但我觉得从同一类的相同/子类的另一个实例调用这些方法的能力对它们实现方式不同的原因有深远的影响。
这是一个非常好的问题,我希望有人能对这些内容的真正实施进行更深入的解释。