微信号: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

参考引用

 
日拱一卒 更多文章 关于小程序的三个FAQ | 开发日常 加密数据解密算法(Ruby实现) | 小程序 git-diff美化工具diff-so-fancy | Git 2017年RoR技术栈流行趋势报告 | Rails 2017年RoR技术栈流行趋势报告 | Rails
猜您喜欢 搞网络最强的其实不是互联网公司,而是印度的电工! Growth Hacking 是运气还是科学? 30分钟构建视频FAQ tv metro应用 计算机求导的四种方法 值得你关注的23款企业级服务工具