ruby - 为什么没有赋值运算符允许我在没有编译器警告的情况下修改 Ruby 常量?

标签 ruby constants concatenation warnings

在下面两个例子中我做同样的事情,创建一个常量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/

相关文章:

c++ - 检查方法是否为常量

C++ lambda 按值语义捕获?

arrays - 在给定索引处将数组切成两半,但忽略索引

javascript - 创建 Ruby Gem 以将 HTML/JavaScript 插入主应用程序

c++ - 为什么即使参数标记为 'const' 也会调用复制构造函数?

mysql - SQL - 删除字段中的重复项

python - 将数据帧上的行一一连接

具有多个查询的 php/mysql

javascript - 有一个简单的浏览器内 JS 游戏需要它在 'backend' 上使用 Ruby 脚本

ruby - 有什么方法可以在不创建新文件的情况下避免 haml 代码重复?