ruby – #freeze除防止修改外还有其他用途吗?
Ruby的
standard uri library有很多用于冻结对象的用法,这些对象要么无法修改,要么修改不会造成伤害:
user,password = ui.split(':'.freeze,2) # from generic.rb String#split不会修改它的参数,即使它确实如此,代码也能正常工作(Ruby将在下次调用时使用新的’:’实例). 以下是对无法更改的对象进行冻结的更多用法(这些都来自generic.rb) if @scheme && @scheme != "ftp".freeze v.delete!("trn".freeze) str << ':'.freeze 为什么有这么多看似不必要的#freeze调用? #freeze除了防止修改其接收器之外还有用吗? 解决方法
这个问题的答案可以在这里找到:
http://tmm1.net/ruby21-fstrings/
TL; DR:Ruby解析器使用.freeze处理字符串文字,而不是没有.freeze的字符串文字.带有.freeze的字符串不会在每次使用时重新实例化,而是来自像符号这样的全局冻结字符串池. 这是一篇关于这个主题的更深入的文章:http://josephyi.com/freeze/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |