"公共"和#34;私人"是保护"保护" ISN' T'

时间:2014-09-19 16:28:38

标签: ruby

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

我很惊讶public的课程为Classprivate的课程相同,让我继续考试:

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会有所不同?

2 个答案:

答案 0 :(得分:3)

问题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

答案 1 :(得分:0)

至于他们真正的课程,我会与经验丰富的人不同。

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

这意味着如果我有两个对象(obj1obj2),它们都是同一个Class的实例。 obj1可以调用protected的{​​{1}}方法,因为它们属于同一类,但obj2无法调用obj1的{​​{1}}方法,因为这些方法是专用于private

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

这是一个非常好的问题,我希望有人能够更深入地解释这些问题的真实实施。