Ruby常量是什么意思?

Ruby常量究竟意味着什么? 以下代码未显示任何“常量”属性。 警告就在那里,但我仍然要改变A指的是什么。

A = 1 puts A # => 1 A = 2 # warning: already initialized constant A puts A # => 2 

或者Ruby常量只是一个没有任何执行的指示?

这是正确的, 常量就像ruby中的变量一样,但是如果你改变它们就会收到警告。

此外,仅仅存在变量的一个区别:即使它们是在另一个类或模块中定义的,您也可以访问常量,例如,给定此片段:

 module Constants PI = 3,1415 other = "variable" end 

您可以访问PI执行Constants::PIConstants::other将无效。

是的,除了打印该警告之外,不会强制执行Ruby常量。

那是对的 – 分配一个常数是一个警告,而不是一个错误; “常量”只是一个指示你应该如何使用某些东西的指标,而不是你那样使用它的规则。

这听起来可能来自静态编程世界,但它在各种元编程设施中非常有用,它可以实现在静态语言中完全不可能完成的事情。

也就是说,如果你真的想确保人们将你的肮脏的手从你的引用中移开,你可以使用Object#freeze 。 改变参考指向的内容仍然可以; 你只是无法改变引用本身的内容:

 irb(main):001:0> class Fruit; attr_accessor :name; end => nil irb(main):002:0> f = Fruit.new => # irb(main):003:0> f.name = "apple" => "apple" irb(main):004:0> f.freeze # After freeze, can't touch this Fruit. => # irb(main):005:0> f.name = "banana" TypeError: can't modify frozen object # Kablammo! from (irb):5:in `name=' from (irb):5 

但这没关系:

 irb(main):006:0> f = Fruit.new => # irb(main):007:0> f.name = "banana" => "banana" 

“常量”实际上是用词不当,Ruby的“常量”最重要的方面不是它们的不变性,而是它们的查找规则。

请参阅: http : //coderrr.wordpress.com/2008/03/11/constant-name-resolution-in-ruby/

常量用于存储不应更改的值。 他们的名字必须以大写字母开头。 按照惯例,大多数常量名称都以全部大写字母书写,下划线作为单词分隔符,例如SOME_CONSTANT。

类中定义的常量可以由该类的所有方法访问。 可以在全局范围内(在任何方法或类中)访问在类外创建的那些。

 class Car WHEELS = 4 def initialize puts WHEELS end end c = Car.new # Output: 4 

请注意,Ruby不会阻止我们更改常量的值,它只会发出警告。

 SOME_CONSTANT = "foo" SOME_CONSTANT = "bar" warning: already initialized constant SOME_CONSTANT warning: previous definition of SOME_CONSTANT was here 

在Ruby中,所有类和模块名称都是常量,但约定规定它们应该用camel case编写,例如SomeClass。

通过使用::(双冒号)运算符,可以从类外部访问常量,甚至可以在另一个类中访问。 要从Car类外部访问WHEELS常量,我们将使用Car :: WHEELS。 ::运算符允许从定义它们的类或模块外部访问常量,公共实例方法和类方法。

一个名为private_constant的内置方法使常量变为私有(只能在创建它们的类中访问)。 语法如下:

 class Car WHEELS = 4 private_constant:WHEELS end Car::WHEELS # Output: NameError: private constant Car::WHEELS referenced 

如果您来自其他编程语言,Ruby处理常量的方式与您可能习惯的方式不同。 通常,常量采用不会在整个应用程序中更改的值。 语法是在命名常量时使用全部大写字母,以便应用程序知道如何处理它。 例如,要设置一个常数以保持棒球队,您可以这样声明:

 TEAM = "Angels" 

我知道你知道的很多,在这里忍受我。 通常,其他编程语言不允许您更改TEAM的值。 但是,Ruby不会阻止您并将最后一个值赋给常量。 在上面的例子中,我可以将其值更改为:

 TEAM = "Athletics" 

其他编程语言会抛出错误或打印出Angels的值。 但是,Ruby打印的值为Athletics,因为这是分配给变量TEAM的最后一个值。 此外,它会发出一条警告消息,指出常量已经初始化并且已更改,因为更改常量被认为是一种糟糕的编程习惯。 但是,它仍然允许您进行更改并遵循Ruby约定,即信任开发人员以做出正确的编程决策。 因此,在Ruby中使用常量时要小心,因为它们可以被覆盖。