文字列の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. Rails 3 - 外部キー - 文字列とシンボル
- 3. Regex JavaScript文字列と結果を変数に格納
- 4. 文字列変数に文字列変数を格納することはできますか? (Java)
- 5. シンボルを評価なしの文字列に変換する
- 6. シンボルをElispの文字列に変換する
- 7. MVCの文字列定数格納先
- 8. 文字列を別のアルファベットのシンボルと比較する
- 9. 文字列の配列をシンボルの配列に変換する方法は?
- 10. Oj.dumpでシリアル化するときにシンボルを文字列に変換する
- 11. 文字列を格納するSQL
- 12. ローカルストレージに文字列を格納する
- 13. C++の文字列配列に変数を格納する方法
- 14. SuspensionManager.SessionStateに文字列以外の文字を格納する
- 15. Lucene.NETに文字列のリストを格納
- 16. 2次元配列内の文字列(文字*)を格納
- 17. modeがStateServerのセッション変数に文字列を格納する場合
- 18. シンボル表の静的変数に関する情報を格納する目的は何ですか?
- 19. データ(文字列)をデータベースに格納
- 20. `@` mysql変数名のシンボル
- 21. sqliteの文字列格納サイズ
- 22. C#の文字列のシンボルを置き換えます。
- 23. Java - IF 'input' = 'this' {配列から変数に文字列を格納}
- 24. Pythonの私は、現在のシンボル にリストから数字を変換しようとしているシンボル
- 25. インスタンス変数とルビーのシンボル(form_for)
- 26. Cは数字とスペースを文字配列に格納します
- 27. エラー:シンボルを見つけることができません。シンボル:変数keyBoard
- 28. Rubyシンボルを整数に変換する
- 29. Matlabの配列に数字で分割した後に文字列を格納
- 30. SharedPreferencesに文字列配列を格納する
どこで文字列を使用するのか、次にシンボルをどこで使用するのですか? –
@RamziddinMakhmudovは、その内容が重要な場合、文字列を使用します。識別子またはラベルが必要な場合は、シンボルを使用します。 – Stefan
清潔で分かりやすい回答ありがとうございます。) –