ruby – =运算符似乎修改冻结的字符串

前端之家收集整理的这篇文章主要介绍了ruby – =运算符似乎修改冻结的字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用红宝石冻结方法.就冻结的定义而言,它冻结了被调用对象的值.我们无法修改该对象的值.我必须完成同样的任务,我有一个对象,我正在执行以下代码
a = "Test"
a.freeze
a += "this string"
puts a

输出如下:

Test this string
[Finished in 0.0s]

为什么要修改我的冻结字符串?

解决方法

没有什么是修改你的冻结字符串

您正在重新分配一个新的字符串

a += "this string"

在Ruby中内部是一样的

a = a + "this string"

当您在Ruby中添加两个String对象时,它将创建一个包含结果的新String(对于支持它的大多数对象,这是操作符的正常行为).这使原来的“测试”和“这个字符串”的值保持不变.原始的,冻结的字符串(包含“测试”)将保留在内存中,直到它被垃圾回收为止.它可以收集,因为你已经丢失了所有的引用.

如果您尝试像这样修改对象:

a << "this string"

那么你应该看到一个错误消息RuntimeError:不能修改冻结的字符串

基本上,你已经将一个局部变量与它所指向的String对象混淆了.可以随时重新分配局部变量,而不受Ruby存储的对象的影响.您可以通过在a = …行之前和之后检查a.object_id来验证您的情况.

原文链接:https://www.f2er.com/ruby/273134.html

猜你在找的Ruby相关文章