访问类的常量

170

当我有以下内容时:

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

  ...
end

有没有一种方法可以通过 Foo::CONSTANT_NAME 访问,或者我必须创建一个类方法来访问这个值?

4个回答

280

你发布的应该完美地工作:

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

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

2
哦,我之前测试时一定输错了。糟糕 :) - Jeremy Smith
12
为了使这个常量真正成为一个常量,在该值的末尾加上 .freezeCONSTANT_NAME = ["a", "b", "c"].freeze - mutexkid
7
经常混淆 ::. ;) - Nick
当使用大写字母时,有些东西很难被发现 ;) - Michael Yin
@Nick,什么是规则?我应该在什么时候使用 .::?谢谢。 - wuarmin
1
@wuarmin 我认为 :: 是用于模块/类级别的东西(所以在上面,CONSTANT_NAME 是一个类的“静态”属性)。你也可以用它来命名空间模块,例如 ActiveRecord::Base. 用于实例属性和方法(例如 Foo.new)。虽然我相信您可以使用 . 来调用静态方法... 在 SO 上有很多关于它的讨论.. 例如:https://dev59.com/dWgu5IYBdhLWcg3w0qVK#11043499 - Nick

52

其他选择:

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"

50
如果您在类中编写包含常量的其他代码,您可以像处理全局变量一样处理它。
class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

如果您在类外访问常量,请使用类名称作为前缀,后跟两个冒号

Foo::MY_CONSTANT  #=> hello

18

有没有一种方法可以访问Foo::CONSTANT_NAME

是的,有:

Foo::CONSTANT_NAME

当我试图访问它时,我收到了以下警告。警告:已经初始化常量TestData :: CONSTANT_VAR。这个变量在别的地方没有被初始化过。为什么会出现这个警告? - ASM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接