当前位置:  开发笔记 > 后端 > 正文

为什么缺少赋值运算符允许我修改Ruby常量而没有编译器警告?

如何解决《为什么缺少赋值运算符允许我修改Ruby常量而没有编译器警告?》经验,为你挑选了2个好方法。

在以下两个示例中,我执行相同的操作,创建一个常量String并使用concat方法对其进行修改.因为它是一个常量,所以我期望编译器警告,但是当我使用赋值运算符时,在第二个例子中只接收一个.为什么是这样?

X = "hello"
X.concat(" world")
puts X # no warning

X = "hello"
X = X.concat(" world")
puts X # warning: already initialized

由于concat方法修改了字符串,这通常是我要做的,因为不需要使用分配运算符.那么,为什么赋值运算符的存在会导致编译器将这两个操作识别为不同?



1> mipadi..:

在Ruby中,变量本质上是指向包含对象的内存中的位置的指针 - 而不是对象本身.在第二个示例中,您正在初始化一个常量X以指向第一行(X = "hello")中的对象,而在第二行中,您再次初始化常量 - 但它已经指向一个对象,因此您得到错误.

常量的不变性并不意味着你不能改变对象 - 它只是意味着你不能改变常量来指向另一个对象.



2> Ryan Bigg..:

这是因为你正在重新定义一个新的X.当你重新定义一个常量时,它会给你"已经初始化"的错误.第一个例子没有给出这个错误,因为你没有重新定义X,你正在修改它.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有