Ruby Ruby 2.1 - 冰冻字符串字面量

luikore · 2013年09月14日 · 最后由 outman 回复于 2013年12月26日 · 3919 次阅读

http://bugs.ruby-lang.org/issues/8579

f 后缀, 结果是 immutable 的字符串

'foo'f
%q'bar'f
%Q(baz)f

f 后缀不能放在相邻字符串的中间

s = "foo" 'bar'f # :)
s = "foo"f 'bar' # :(

内部表示: frozen string 只存一份, 和 string.freeze 不一样

'foo'f.object_id == 'foo'f.object_id # true
'foo'.freeze.object_id == 'foo'.freeze.object_id # false

一个用途是减少对象分配. 例如下面的方法

def development?
  @env == 'development'
end

每次调用, 'development' 都是一个新的字符串

改成这样的话:

def development?
  @env == 'development'f
end

就只会在第一次调用生成新字符串

另一个用途是以后拆分 GVL 的时候, 访问 frozen string 的方法基本不需要加锁


是否将冰冻语法扩展到数组和哈希还在讨论中

http://bugs.ruby-lang.org/issues/8909


最近更新: 2.1dev 中已经将这个后缀喀嚓了. 同时引入了编译器优化, 可以将 "foo".freeze 变成字符串池中的对象.

<<这样的方法会怎么样呢?

#1 楼 @jjym 好像暂时没有兼容 heredoc 字符串的方案

擦,ruby 是要走底层路线吗?

#1 楼 @jjym 哦, 只有普通的字符串支持 <<

'foo' << ':)'f
'foo'f << ':(' # can't modify frozen string

莫非是弄了个字符串池?

不知怎滴, 看到标题, 我联想起了这句话, Walking on water and developing software to specification are easy as long as both are frozen.

这个语法,在刚刚发布的 2.1 里面已经去掉了。仍然采用 freeze 方法,不过这个方法已经经过 VM 优化了。

blackanger Ruby 2.1 Features PDF 提及了此话题。 09月07日 18:56
需要 登录 后方可回复, 如果你还没有账号请 注册新账号