我使用红宝石冻结方法.就冻结的定义而言,它冻结了被调用对象的值.我们无法修改该对象的值.我必须完成同样的任务,我有一个对象,我正在执行以下代码
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来验证您的情况.