在下面两个例子中我做同样的事情,创建一个常量String并使用concat方法修改它。因为它是一个常量,所以我期待编译器警告,但在我使用赋值运算符时仅在第二个示例中收到警告。这是为什么?
X = "hello"
X.concat(" world")
puts X # no warning
X = "hello"
X = X.concat(" world")
puts X # warning: already initialized
由于 concat 方法会就地修改字符串,这通常是我会做的,因为不需要使用赋值运算符。那么,为什么赋值运算符的存在会导致编译器将这两个操作识别为不同的?
最佳答案
在 Ruby 中,变量本质上是指向内存中包含对象的位置的指针,而不是对象本身。在第二个示例中,您正在初始化常量 X
以指向第一行中的对象 (X = "hello"
),而在第二行中,您是再次初始化常量——但它已经指向一个对象,所以你得到了错误。
常量的不变性并不意味着您不能更改对象——它只是意味着您不能更改常量以指向另一个对象。
关于ruby - 为什么没有赋值运算符允许我在没有编译器警告的情况下修改 Ruby 常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/670094/