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 变成字符串池中的对象。