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::PI
而Constants::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中使用常量时要小心,因为它们可以被覆盖。