Ruby の文字列とシンボルの違いは何ですか?

概要

Ruby の文字列とシンボルの違いは何ですか?また、どのような場合にどちらを使用すべきでしょうか?

解決策

主な違いは、単一の値を表す複数のシンボルは同一ですが、文字列の場合はそうではないことです。例えば:

irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618

これらはシンボル :test への 3 つの参照であり、すべて同じオブジェクトです。

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 だけではなく文字列値を比較する必要があるため、はるかに遅くなります。

いつどちらを使用するかについては、私は通常、文字列ではなく一意の識別子が本当に必要なハッシュ キーなどを除いて、ほとんどすべてに文字列を使用します。