gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:21:06 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com