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