【问题标题】:Accessing a class's constants访问类的常量
【发布时间】:2011-09-19 15:08:23
【问题描述】:

当我有以下情况时:

class Foo
   CONSTANT_NAME = ["a", "b", "c"]

  ...
end

有没有办法使用Foo::CONSTANT_NAME 进行访问,还是我必须创建一个类方法才能访问该值?

【问题讨论】:

    标签: ruby-on-rails ruby constants


    【解决方案1】:

    您发布的内容应该可以完美运行:

    class Foo
      CONSTANT_NAME = ["a", "b", "c"]
    end
    
    Foo::CONSTANT_NAME
    # => ["a", "b", "c"]
    

    【讨论】:

    • 嗯,我之前测试的时候一定是打错了。哎呀:)
    • 要真正成为一个常数,不要忘记在值的末尾添加一个 .freeze ! CONSTANT_NAME = ["a", "b", "c"].freeze
    • 总是混淆::. ;)
    • 大写时很难发现;)
    • @wuarmin 我相信:: 是用于模块/类级别的东西(所以在上面,CONSTANT_NAME 是一个类“静态”属性)。您还可以将它用于模块命名空间,例如ActiveRecord::Base. 用于实例属性和方法(例如Foo.new)。虽然我相信你可以使用.来调用静态方法...关于它的讨论很多..例如:stackoverflow.com/a/11043499/224707
    【解决方案2】:

    如果您在包含该常量的类中编写其他代码,则可以将其视为全局代码。

    class Foo
      MY_CONSTANT = "hello"
    
      def bar
        MY_CONSTANT
      end
    end
    
    Foo.new.bar #=> hello
    

    如果你在类之外访问常量,在它前面加上类名,后跟两个冒号

    Foo::MY_CONSTANT  #=> hello
    

    【讨论】:

      【解决方案3】:

      有没有办法访问Foo::CONSTANT_NAME

      是的,有:

      Foo::CONSTANT_NAME
      

      【讨论】:

      • 当我尝试访问它时,我收到以下警告。警告:已初始化常量 TestData::CONSTANT_VAR 此变量未在其他任何地方初始化。为什么我会收到此警告?
      【解决方案4】:

      一些替代方案:

      class Foo
        MY_CONSTANT = "hello"
      end
      
      Foo::MY_CONSTANT
      # => "hello"
      
      Foo.const_get :MY_CONSTANT
      # => "hello"
      
      x = Foo.new
      x.class::MY_CONSTANT
      # => "hello"
      
      x.class.const_defined? :MY_CONSTANT
      # => true
      
      x.class.const_get :MY_CONSTANT
      # => "hello"
      

      【讨论】:

        猜你喜欢
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 2011-11-28
        • 2016-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多