微信号:rigongyizu365

介绍:一线码农不端不装的「日拱一卒」,关注技术、书籍、创业、GTD、以及一切个人成长周边的话题,每周一到五更新.

一个关于freeze的小问题 | Ruby

2017-01-11 23:57 lazybios

来分享一个StackoverFlow上关于freeze的小问题。Ruby里的freeze方法可以将一个Ruby对象冻结起来防止其被意外更改。但下面这段代码居然没有报错,是不是很奇怪呢?

a = "Test"
a.freeze
a += "this string"
puts a

Test this string
[Finished in 0.0s]

行为上看起来有些吊诡,但实际上问题并没有出在freeze上,freeze所限制的是一个对象,而这里确实为一个变量重新赋值,下面两句其实是等价的:

a += "this string"
a = a + "this string"

也就是说"Test"对象并没有被修改,其仍然在内存中,只不过现在成了一个无法被访问等待回收的垃圾对象。这一点可以通过a.object_id观察到。

当你真正要修改freeze对象时,它依然会抛出一个运行时错误,像下面这样:

a << "this string"
RuntimeError: can't modify frozen String

-完-

您还可以看:

CS183C创业课: Blitzscaling 课程笔记(一)

Rails: 避免路由嵌套过深

Rails: Active Record中update方法的异同(二)

REPL驱动的软件开发 | 开发日常

如何从Gitlab顺利迁移到Github | Git

参考引用

 
日拱一卒 更多文章 RubyGems 2016 Ruby生态圈发展趋势报告 一张emoji帮你搞懂map、filter、reduce | 有用功 一张emoji帮你搞懂map、filter、reduce | 有用功 git-diff美化工具diff-so-fancy | Git git-diff美化工具diff-so-fancy | Git
猜您喜欢 一位考上清华的学霸,给中国父母的8个忠告 魔都互联网为何被帝都甩成渣(5):地域文化 Android wear 中国特别版GMS 你真的了解weight和weightSum吗? 思维导图之Linux Kernel