类中的 ruby​​ 常量范围<< self 块

iva*_*van 3 ruby scope private

给定一个红宝石类

class Thing
  class << self
    NUM = 3

    def speak
      NUM.times { puts "Hi!" }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我无法Thing::NUM从课外访问。如果改为

class Thing
  NUM = 3
  class << self
    def speak
      NUM.times { puts "Hi!" }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

Thing.speak仍然按预期工作,但我现在也可以访问Thing::NUM. 我知道这个class << self习惯用法打开了对象的单例类,但我很困惑为什么这样定义的类方法可以公开访问而常量不是。

Car*_*and 5

您必须引用正确的类:

Thing.singleton_class::NUM #=> 3
Run Code Online (Sandbox Code Playgroud)

单例类中常量和方法的引用方式没有不一致:

Thing.methods.include?(:speak)                          #=> true 
Thing.singleton_class.methods.include?(:speak)          #=> false
Thing.singleton_class.instance_methods.include?(:speak) #=> true 
Run Code Online (Sandbox Code Playgroud)