访问类的常量


142

当我有以下内容时:

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

  ...
end

有没有一种方法可以访问,Foo::CONSTANT_NAME或者必须使类方法访问该值?

Answers:


244

您发布的内容应该可以正常运行:

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

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

2
嗯,我以前测试的时候一定打错了打字。糟糕:)
杰里米·史密斯

12
为了使它真正成为一个常量,请不要忘记在值的末尾添加.freeze!CONSTANT_NAME = ["a", "b", "c"].freeze
Mutoxkid 2015年

6
总是把这::.);
尼克

大写时很难发现问题;)
迈克尔·殷

42

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

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

如果要在类外部访问常量,请在该类的前缀前面加上两个冒号

Foo::MY_CONSTANT  #=> hello

42

一些替代方案:

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"

17

有访问的方法Foo::CONSTANT_NAME吗?

就在这里:

Foo::CONSTANT_NAME

当我尝试访问它时,出现以下警告。警告:已经初始化的常量TestData :: CONSTANT_VAR此变量未在其他任何地方初始化。为什么我收到此警告?
ASM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.