加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 20:19:18 所属栏目:百科 来源:网络整理
导读:我使用红宝石冻结方法.就冻结的定义而言,它冻结了被调用对象的值.我们无法修改该对象的值.我必须完成同样的任务,我有一个对象,我正在执行以下代码 a = "Test"a.freezea += "this string"puts a 输出如下: Test this string[Finished in 0.0s] 为什么要修改
我使用红宝石冻结方法.就冻结的定义而言,它冻结了被调用对象的值.我们无法修改该对象的值.我必须完成同样的任务,我有一个对象,我正在执行以下代码
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来验证您的情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读