文字列のobject_id
は常に異なるのに対し、シンボル 'object_id
は同じ(値が等しい場合)です。私が理解するように、シンボルと文字列の違いは、不変性とパフォーマンスです。変数内に文字列を格納してフリーズすることはできませんか?シンボル(変数とシンボルの文字列を格納する)
答えて
はほとんど、ルビーの最近のバージョンは、凍結された文字列を最適化することができます。[...]文字列を変数に格納してフリーズすることはできません。
'foo'.freeze.object_id #=> 70313275108080
'foo'.freeze.object_id #=> 70313275108080
しかし、この最適化には限界があります。それは、文字列のために働くリテラル(上図のように)が、文字列が後に凍結されている場合、それは動作しません:
# frozen_string_literal: true
puts 'foo'.object_id
puts 'foo'.object_id
出力:
a = 'foo'
a.freeze
a.object_id #=> 70313275335500
b = 'foo'
b.freeze
b.object_id #=> 70313275274260
あなたはfrozen_string_literal
機能を有効にしない限り:
$ ruby test.rb
70185151269500
70185151269500
または、コマンドラインから:
$ ruby --enable-frozen-string-literal -e "puts 'foo'.object_id, 'foo'.object_id"
70102955495340
70102955495340
freeze
は、実際のオブジェクトの変更を防止しますが、変数はオブジェクトへの参照であり、依然として参照を変更することができます。たとえば、以下は完全に有効です。
a = "foo"
a.freeze
a = "boo"
a
の最後は "boo"です。
Rubyバージョン2.1以前では、シンボルに利用可能なobject_id
が割り当てられ、同じシンボル識別子が使用されるときはいつも同じobject_idが使用されます。これは決してガベージコレクションされません。これは不変ですが、より効率的です(メモリオーバヘッドが減ります)。
Rubyバージョン2.2以降では、シンボルはガベージコレクトされる点を除き、基本的に同じです。この変更の理由は、シンボルのDoS攻撃を防止するためでした。
どこで文字列を使用し、どこでシンボルを使用するのですか? –
ありがとうございました!私はシンボルのDoS攻撃について読むでしょう:) –
- 1. 分割文字列とシンボル
- 2. 文字列内のシンボルを数えて
- 3. 特定のシンボルと文字列だから私は、シンボル持っ
- 4. Rails 3 - 外部キー - 文字列とシンボル
- 5. Pythonの文字列を変数に格納する方法は?
- 6. シンボルを評価なしの文字列に変換する
- 7. elispで文字列のリストをシンボルに変換する方法
- 8. 文字列をJavaScriptのシンボルに変換する方法
- 9. シンボルをElispの文字列に変換する
- 10. 各文字の数をPHPの文字列に格納する
- 11. 文字列変数に文字列変数を格納することはできますか? (Java)
- 12. Regex JavaScript文字列と結果を変数に格納
- 13. セッション記憶番号変数を文字列として格納
- 14. Rails列挙型シンボル対文字列
- 15. シンボルと特殊文字の代わりにPHPの文字列
- 16. シンボルを "unmangled"文字列に変換する
- 17. MVCの文字列定数格納先
- 18. 文字列を別のアルファベットのシンボルと比較する
- 19. C - シンボルの場所に格納された値をプリントする
- 20. シンボル変数
- 21. 文字列の配列をシンボルの配列に変換する方法は?
- 22. クエリ文字列はスペースを?に変換します。 (シンボル)asp.net
- 23. PHP:データベースのシンボルを含むデータを配列jsonに格納する方法は?
- 24. RenderActionの結果を文字列変数に格納
- 25. UITextFieldのユーザー入力データを文字列変数に格納
- 26. Oj.dumpでシリアル化するときにシンボルを文字列に変換する
- 27. 変数に格納されたXML文字列に変数を追加する
- 28. HashWithIndifferentAccessを使用している場合の文字列とシンボル
- 29. 文字列に格納された文字 - ランダム化されたときに別の文字列変数に格納する方法
- 30. 文字列に複数の整数を格納する
どこで文字列を使用するのか、次にシンボルをどこで使用するのですか? –
@RamziddinMakhmudovは、その内容が重要な場合、文字列を使用します。識別子またはラベルが必要な場合は、シンボルを使用します。 – Stefan
清潔で分かりやすい回答ありがとうございます。) –