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

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

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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号