类 << self block 内的 ruby​​ 常量作用域

标签 ruby scope private

给定一个 ruby 类

class Thing
  class << self
    NUM = 3

    def speak
      NUM.times { puts "Hi!" }
    end
  end
end

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

class Thing
  NUM = 3
  class << self
    def speak
      NUM.times { puts "Hi!" }
    end
  end
end

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

最佳答案

您必须引用正确的类:

Thing.singleton_class::NUM #=> 3

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

Thing.methods.include?(:speak)                          #=> true 
Thing.singleton_class.methods.include?(:speak)          #=> false
Thing.singleton_class.instance_methods.include?(:speak) #=> true 

关于类 << self block 内的 ruby​​ 常量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28613765/

相关文章:

ruby on rails 3.1 全局异常处理程序

scope - QML 组件作用域拼图

go - 当编写一个包用作命令时,这是惯用的 : name all identifiers as private or name all identifiers as public?

Java-私有(private)内部类公共(public)成员

ruby - 在另一个模块中包含一个模块

ruby-on-rails - 在Rails中存储StandardError的异常类名称

ruby-on-rails - Griddler 配置未定义的方法 processor_class

javascript - 在循环之后访问 for 循环计数器是否安全?

Haskell:将lambda表达式与绑定(bind)函数一起使用时的变量范围

c - Get and Set ("private") 在 C 中的缺点?