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
会有所不同?答案 0 :(得分:3)
问题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
答案 1 :(得分:0)
至于他们真正的课程,我会与经验丰富的人不同。
至于protected
不同protected
可以由类的任何实例或它的子类使用,其中private
不能使用显式接收器调用。 private
方法只能由类本身或它的直接后代调用。必须在调用对象的上下文中调用private
个方法。
这意味着如果我有两个对象(obj1
和obj2
),它们都是同一个Class
的实例。 obj1
可以调用protected
的{{1}}方法,因为它们属于同一类,但obj2
无法调用obj1
的{{1}}方法,因为这些方法是专用于private
。
我不确定这是否会以任何方式回答您的问题,但我觉得从同一类的相同/子类的另一个实例调用这些方法的能力会对它们的实现方式产生深远的影响。
这是一个非常好的问题,我希望有人能够更深入地解释这些问题的真实实施。