2014-09-19 90 views
4
irb(main):001:0> public.class 
=> Class 
irb(main):002:0> private.class 
=> Class 

我很惊讶的是,类publicClass,同为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>' 

呃,现在我更糊涂了。所以我的问题是:

  1. publicprivate真的类吗?
  2. protected为什么不同?
+0

我假设你没有问'public','protected'和'private'之间的区别是什么,而是为什么2被实现为类,而第三个('protected')是以不同的方式实现的。 – engineersmnky 2014-09-19 17:03:29

回答

3

答案对问题1是否定的,publicprivate不是类,它们是在模块的方法,因为是protected。尽管如此,它们都返回self,在您的示例中,它是Class的一个实例。

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

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

例如,下面的代码:

class Foo 
    puts public 
    puts private 
    puts protected 
end 

产生这种outut,没有错误protected

Foo 
Foo 
Foo 
+0

我怀疑有一种特殊情况实现不允许在主Object对象类中进行保护...毕竟,这将与public同义,因为所有对象都从Object继承。 – DGM 2014-09-19 22:32:57

0

至于他们真的类我将不同的人用得比较多的经验我自。

至于protected是不同的protected可以用于该类的任何实例或它的子类,因为private不能用明确的接收器调用。 private方法只能由类本身或其直接后代调用。必须在调用对象的上下文中调用方法private

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

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

这是一个非常好的问题,我希望有人会对这些问题的真正实现给出更深入的解释。