Ruby中的常量和变量有什​​么区别?

时间:2016-12-21 21:34:12

标签: ruby

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

  • 变量可以改变它的值,它可以变化。
  • 常数不能改变它的值,它是恒定的。

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

答案 2 :(得分:0)

在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