为什么文字字符串应该开始冻结?(Ruby 2.1)

Cha*_*rse 2 ruby immutability ruby-2.1

在开发Ruby 2.1之后,我已经阅读了一个可能会添加的功能,因此允许开发人员指定文字字符串应该从"冻结"开始.

语法如下所示(注意尾随f):

str = "imfrozen"f    # str receives a frozen string
Run Code Online (Sandbox Code Playgroud)

其他Ruby文档/维基中,我读过这个功能提供了以下好处:

这允许VM每次使用相同的String对象,并且可能跨越许多文件使用相同的冻结字符串.它显然也提供了冻结字符串的所有不变性保证.

我的问题是:

  • 这有什么好处?
  • 什么是这样的功能何时提供价值的真实世界的例子?
  • 这有symbol什么不同?

谢谢

saw*_*awa 7

假设你有这样的代码

array_that_is_very_long.each do |e|
  if e == "foo"
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

在此代码中,对于每次迭代array_that_is_very_long,将"foo"创建一个新字符串(并将其抛出),这极大地浪费了资源.目前,您可以通过以下方式解决此问题:

Foo = "foo"
array_that_is_very_long.each do |e|
  if e == Foo
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

建议的语法使这更容易做到:

array_that_is_very_long.each do |e|
  if e == "foo"f
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)