【问题标题】:ruby constant scope inside a class << self block类 << self 块内的 ruby​​ 常量范围
【发布时间】:2015-02-19 18:10:06
【问题描述】:

给定一个像这样的 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 &lt;&lt; self 习惯用法会打开对象的单例类,但我很困惑为什么这样定义的类方法可以公开访问,而常量却不能。

【问题讨论】:

    标签: ruby scope private


    【解决方案1】:

    你必须引用正确的类:

    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 
    

    【讨论】:

      【解决方案2】:

      我很困惑为什么这样定义的类方法可以公开访问,而常量却不能。

      是什么让你认为他们不是?

      class Thing
        class << self
          NUM = 3
        end
      end
      
      Thing.singleton_class::NUM
      # => 3
      

      该常量是在Thing 的单例类的范围内定义的,因此您可以在此处访问它,与访问在Thing 中定义的常量的方式完全相同。

      请从逻辑上考虑一下:如果您在 Foo 类中定义了一个常量 BAR,则可以使用 Foo::BAR 访问它。如果您在类Qux 中定义一个常量BAR,您可以使用Qux::BAR 访问它。如果你在Foo 的单例类中定义了一个常量BAR,你可以使用...... ???

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 2011-02-10
        • 1970-01-01
        • 2014-02-27
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多