【发布时间】:2011-09-19 15:08:23
【问题描述】:
当我有以下情况时:
class Foo
CONSTANT_NAME = ["a", "b", "c"]
...
end
有没有办法使用Foo::CONSTANT_NAME 进行访问,还是我必须创建一个类方法才能访问该值?
【问题讨论】:
标签: ruby-on-rails ruby constants
当我有以下情况时:
class Foo
CONSTANT_NAME = ["a", "b", "c"]
...
end
有没有办法使用Foo::CONSTANT_NAME 进行访问,还是我必须创建一个类方法才能访问该值?
【问题讨论】:
标签: ruby-on-rails ruby constants
您发布的内容应该可以完美运行:
class Foo
CONSTANT_NAME = ["a", "b", "c"]
end
Foo::CONSTANT_NAME
# => ["a", "b", "c"]
【讨论】:
CONSTANT_NAME = ["a", "b", "c"].freeze
::和. ;)
:: 是用于模块/类级别的东西(所以在上面,CONSTANT_NAME 是一个类“静态”属性)。您还可以将它用于模块命名空间,例如ActiveRecord::Base。 . 用于实例属性和方法(例如Foo.new)。虽然我相信你可以使用.来调用静态方法...关于它的讨论很多..例如:stackoverflow.com/a/11043499/224707
如果您在包含该常量的类中编写其他代码,则可以将其视为全局代码。
class Foo
MY_CONSTANT = "hello"
def bar
MY_CONSTANT
end
end
Foo.new.bar #=> hello
如果你在类之外访问常量,在它前面加上类名,后跟两个冒号
Foo::MY_CONSTANT #=> hello
【讨论】:
有没有办法访问
Foo::CONSTANT_NAME?
是的,有:
Foo::CONSTANT_NAME
【讨论】:
一些替代方案:
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"
【讨论】: