2

Ruby 2.1 の開発に続いて、開発者が文字列リテラルを「凍結」して開始するように指定できるようにする機能が追加される可能性があるという記事を読みました。

構文は次のようになります (末尾の に注意してくださいf)。

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

の Ruby ドキュメント/wikiで、この機能が次の利点を提供することを読みました。

これにより、VM は毎回同じ文字列オブジェクトを使用でき、多くのファイルで同じ固定文字列を使用できる可能性があります。また、明らかに、凍結された文字列のすべての不変性保証も提供します。

私の質問は次のとおりです。

  • これの利点は何ですか?
  • このような機能が価値を提供する実世界の例は何ですか?
  • これは a とどう違うのsymbolですか?

ありがとうございました

4

1 に答える 1

7

このようなコードがあったとします

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
于 2013-10-03T21:35:21.100 に答える