Ruby中常量和变量之间有什么区别?

所以,我正在使用CodeAcademy的Ruby课程,而且我一直在区分变量和类之间的区别。 有人可以向我解释一下这个区别吗? 我会给你cookies! ^^。 无论我在网上看哪里,都找不到任何相关信息。

Ruby中常量的概念是它们只能分配一次值,而您可以根据需要多次为变量赋值。 从技术上讲,您甚至可以为常量分配新值。 但是Ruby会在这种情况下发出警告,你应该尽量避免这种情况。

我认为导致Ruby新手混淆的主要问题是,即使分配给常量的值也可以在没有警告的情况下进行修改(例如,通过向数组添加新元素)。 常量引用与此处的变量没有区别,因为引用不限制可以对值执行的操作。 变量或常量引用的对象始终独立于该变量。

在这个例子中,我为ARRAY常量分配了一个新数组。 稍后,我可以通过添加一个新成员来愉快地更改数组。 常数并不关心这一点。

 ARRAY = [] # => [] ARRAY << :foo ARRAY # => [:foo] 

禁止(或者,允许带警告)的唯一事情是,如果您尝试为常量分配一个全新的值:

 ARRAY2 = [] # => [] ARRAY2 = [:bar] # warning: already initialized constant ARRAY2 ARRAY2 => [:bar] 

因此,通常的做法是立即冻结分配给常量的值,以完全拒绝任何进一步的更改,并确保保留原始值(除非有人分配新值):

 ARRAY3 = [:foo, :bar].freeze ARRAY3 << :baz # RuntimeError: can't modify frozen Array 
  • 变量可以改变它的值,它可以变化。
  • 常量不能改变它的值,它是恒定的。

在Ruby中,事情有点复杂。 您可以重新分配常量的值,但会打印警告。 这仅用于调试,一般原则仍然适用于常量用于永不改变的值。

在Ruby中,常量是以大写字母开头的标识符; 它只打算分配一次。 你可以重新分配常数,但不应该。 这样做会产生警告:

 NAME = "Fred" NAME = "Barney" # => Warning: Already initialized constant NAME 

变量是不以大写字母开头的标识符; 它可能被分配给不止一次:

 name = "Fred" name = "Barney" # => No warning 

创建类时,会创建一个与该类同名的常量; 该常量绑定到类:

 class Foo end 

这相当于这个代码创建了一个新的匿名类并将其分配给常量Foo:

 Foo = Class.new do end 

您可以使用任何其他常量重新指定常量标识符Foo,但当然您不应该,并且您仍然会收到警告:

 Foo = 123 # => Already initialized constant Foo