【问题标题】:Why should a literal String start out Frozen? (Ruby 2.1)为什么文字字符串应该从 Frozen 开始? (红宝石 2.1)
【发布时间】:2013-10-10 18:08:31
【问题描述】:

在开发 Ruby 2.1 之后,我读到了一个可能会添加的功能,因此允许开发人员指定文字字符串应该以“冻结”开头。

语法如下(注意结尾的f):

str = "imfrozen"f    # str receives a frozen string

other Ruby documentation/wiki 我读到这个功能提供了以下好处:

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

我的问题是:

  • 这样做有什么好处?
  • 在现实世界中,这样的功能何时可以提供价值的示例是什么?
  • 这与symbol 有何不同?

谢谢

【问题讨论】:

  • 我目前的理解是这些新的冻结字符串就像符号一样,但是可以被垃圾回收。

标签: ruby immutability ruby-2.1


【解决方案1】:

假设你有这样的代码

array_that_is_very_long.each do |e|
  if e == "foo"
    ...
  end
end

在这段代码中,对于array_that_is_very_long 的每次迭代,都会创建一个新字符串"foo"(并被丢弃),这是对资源的巨大浪费。目前,您可以通过以下方式解决此问题:

Foo = "foo"
array_that_is_very_long.each do |e|
  if e == Foo
    ...
  end
end

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

array_that_is_very_long.each do |e|
  if e == "foo"f
    ...
  end
end

【讨论】:

  • 非常感谢。这些代码示例非常清楚地说明了如何使用它。不过会有什么好处呢?更小的内存占用?更快的执行?为什么不用符号?
  • 如果e是一个字符串,除非在代码的其他部分有特殊使用,否则没有理由将if转换为符号并将其作为符号进行比较。
猜你喜欢
  • 2010-11-29
  • 1970-01-01
  • 2014-02-11
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多