self.class和class之间的区别<<自

时间:2014-01-12 08:29:53

标签: ruby class

尝试了解私有受保护在用于类方法时的工作原理我来自some other question的此代码:

class Bang
    def instance_bang
      self.class.class_bang
    end

    protected
    def self.class_bang
      puts "bang"
    end
end

从Bang的实例调用 instance_bang 按预期工作,但是当我采用 class<<的方法时,我无法理解以下代码的不同之处自

class Bang
  def instance_bang
    self.class.class_bang
  end

  class << self
    protected 
    def class_bang
      puts "bang"
    end
  end
end

对我而言,两段代码似乎都是相同的,但第二段代码失败, NoMethodError 声称 class_bang 受到保护。

1 个答案:

答案 0 :(得分:2)

在第二个代码块中,protected用于指定Bang类方法的可见性。但是'def self.class_bang'在Bang的单例类上定义了一个方法,因此受保护的密钥不适用于该方法。

在第一个代码块中,你打开Bang的单例类,所以protected用于指定Bang的单例类方法的可见性,这意味着protected将适用于class_bang方法。这就是你得到错误的原因。

有关详情,请参阅:http://blog.jayfields.com/2006/11/ruby-protected-class-methods.html