Ruby中对字符串前加短横线未实现对象冻结的问题咨询
问题原因分析:运算符优先级错误
你遇到的问题本质是Ruby运算符优先级和执行顺序不符合你的预期,和-前缀冻结字符串的语法本身无关:
- Ruby中方法调用的优先级高于一元减号运算符,你写的
-"fdsa".object_id实际执行逻辑为:- 先创建字符串字面量
"fdsa" - 调用该字符串的
object_id方法,得到对应的整数返回值 - 对这个整数执行一元减运算,全程没有触发
-前缀针对字符串的冻结逻辑
- 先创建字符串字面量
- 你两次执行代码时,每次都会创建新的
"fdsa"字符串实例,拿到的自然是不同的object_id,和冻结功能完全没有关系。
而"asdf".freeze.object_id的执行顺序符合预期:先创建"asdf"字符串、调用freeze方法返回冻结后的同个对象,再调用object_id,相同字面量的冻结字符串会被Ruby复用,因此两次返回的id一致。
正确测试写法
给-"fdsa"部分加上括号,保证先执行字符串冻结逻辑再拿id:
(-"fdsa").object_id (-"fdsa").object_id
执行后两次输出的object_id完全相同,符合冻结字符串复用的预期。
内容的提问来源于stack exchange,提问作者NonCreature0714
相关产品推荐
相关产品推荐

