Ruby の文字列とシンボルの違いは何ですか? また、いつどちらを使用する必要がありますか?
11 に答える
主な違いは、単一の値を表す複数のシンボルが同一であるのに対し、文字列ではそうではないことです。例えば:
irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
これらはシンボル への 3 つの参照:test
であり、すべて同じオブジェクトです。
irb(main):010:0> "test".object_id
=> -605770378
irb(main):011:0> "test".object_id
=> -605779298
irb(main):012:0> "test".object_id
=> -605784948
これらは文字列「test」への 3 つの参照ですが、すべて異なるオブジェクトです。
これは、シンボルを使用すると、アプリケーションによってはかなりの量のメモリを節約できる可能性があることを意味します。また、シンボルは同じオブジェクトであるため、等しいかどうかを比較する方が高速です。オブジェクト ID だけでなく文字列値を比較する必要があるため、同一の文字列の比較は非常に遅くなります。
どちらをいつ使用するかというと、文字列ではなく一意の識別子が本当に必要なハッシュキーなどを除いて、ほとんどすべてに文字列を使用します。
シンボルと文字列の違いは何ですか?
- シンボルは不変です。値は一定のままです。
- 同じシンボルを複数回使用すると、同じオブジェクト ID を持ち、毎回一意のオブジェクト ID を持つ異なるオブジェクトになる文字列と比較して同じオブジェクトになります。
split
Symbolsのような String メソッドを呼び出すことはできません。
中国語を知っている場合は、Ruby Symbolの理解も読むことができます。
String
との追加の違いSymbol
は、 aが比較的無駄のないオブジェクトであるのString
に対し、 a には文字列操作用のメソッドが多数あることです。Symbol
String
classとSymbol
classのドキュメントを確認してください。
Ruby の String と Symbol には主に 2 つの違いがあります。
文字列は可変で、シンボルは可変ではありません:
- 文字列は可変であるため、どこかで変更される可能性があり、結果が正しくない可能性があります。
- シンボルは不変です。
文字列はオブジェクトなので、メモリ割り当てが必要です
puts "abc".object_id # 70322858612020 puts "abc".object_id # 70322846847380 puts "abc".object_id # 70322846815460
一方、Symbol は同じオブジェクトを返します。
puts :abc.object_id # 1147868 puts :abc.object_id # 1147868 puts :abc.object_id # 1147868
そのため、文字列はシンボルよりも使用および比較に時間がかかります。
詳細については、「 Ruby のシンボルと文字列の違い」を参照してください。
Strings are Mutable , Symbols arre immutable
注: 可変オブジェクトは代入後に変更できますが、不変オブジェクトは上書きのみ可能です
http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and -ストリングス/
シンボルは不変で、文字列は変更可能です。
文字列に対して操作を実行すると、新しいオブジェクトが作成され、メモリが使用されます。文字列に対してより多くの操作を実行すると、より多くのメモリを消費することになります。
シンボルは不変のオブジェクトであり、操作を実行すると元のオブジェクトに変更が加えられます。オブジェクトは作成されないため、より収益性が高くなります。
詳細については、ここをクリックしてください
シンボルは、名前と文字列を表すために使用するものです。文字列を数回使用する必要がある場合は、シンボルを使用すると、はるかに簡単で生産的になります。
そして、Google経由でこれを見つけたところ、より詳細な情報が提供される可能性があります。
シンボルと文字列は完全に異なります。この投稿では、違いについて少し洞察しています。それらをいつどこで使用するかについては、この件に関するかなり広範な投稿があり、has many :through があります。