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だけではなく文字列値を比較する必要があるため、同一の文字列の比較ははるかに遅くなります。
いつ使用するかというと、私は通常、文字列ではなく一意の識別子が本当に必要なハッシュキーなどを除いて、ほとんどすべての文字列を使用します。
シンボルと文字列の違いは何ですか?
split
のようなStringメソッドを呼び出すことはできません。中国語なら 理解Ruby Symbol も読めます。
ステートメント:
foo = "bar"
メモリに新しいオブジェクトを作成します。ステートメントを繰り返す場合:
foo = "bar"
別のオブジェクトを作成します。
それをより明確に理解するには、IRBでこのコードを試してください:
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
次のような出力が得られます。
string bar with object id = 70358547221180
string bar with object id = 70358548927060
これは、同じ文字列に対して2つの異なるオブジェクトがあることを明確に示しています。これで、シンボルを使用するとシンボルごとに1つのオブジェクトが作成されます。
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
ショー:
symbol bar with object id = 7523228
symbol bar with object id = 7523228
つまり、:bar
のオブジェクトは1つだけです。
さらに、Symbolsはimmutableであり、Symbolsでupcase
やsplit
などのStringメソッドを呼び出すことはできません。
シンボルの比較は、文字列の比較よりも高速です。シンボルは、ヒープ上のメモリポインタに効果的に変換される一意のセットを形成する定数/不変文字列と考えることができます。これは、2つの整数(メモリポインタ)を比較するだけなので、2つのシンボルの比較が高速であることを意味します。
文字列は変更可能なので、ヒープ上の値へのメモリポインタは変更後に変更できます。つまり、意味的に同等な重複が存在する可能性があるため、比較操作が遅くなります。
値が一定であることが確実な場合は、シンボルを使用してください。たとえば、ハッシュキーにシンボルを使用します。値を変更する場合、または文字列メソッドを使用する場合は、文字列を使用します。
String
とSymbol
のもう1つの違いは、String
には文字列操作用のメソッドが多数あるのに対し、Symbol
は比較的リーンなオブジェクトです。 。
String
class と Symbol
class のドキュメントを確認してください。
シンボルが災害になるケース。 Railsコントローラ)にparams.map(&:to_sym)
があるとします。ここで、何らかの理由でユーザーから提供されたデータをシンボルに変換している場合、危険な場合があります。ユーザーから提供されたデータが大きすぎるため、シンボルがガベージコレクタではないことがわかっているため、サーバーのメモリを使い果たしてWebサイトを停止させる可能性があります。
Rubyの文字列とシンボルには、主に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
したがって、文字列はシンボルよりも使用および比較に時間がかかります。
詳細については、「 The = The Difference Between Ruby Symbols and Strings "」を参照してください。
シンボルは不変で、文字列は変更可能です。
文字列に対して何らかの操作を実行すると、新しいオブジェクトが作成され、メモリが使用されます。文字列に対してより多くの操作を実行すると、より多くのメモリを消費することになります。
シンボルは不変のオブジェクトであり、操作を実行すると元のオブジェクトに変更が加えられます。オブジェクトは作成されないため、収益性が高くなります。
詳細については、次のことができます ここをクリック
文字列は可変であり、シンボルは不変である
注:変更可能なオブジェクトは割り当て後に変更できますが、不変のオブジェクトは上書きのみ可能です http://www.robertsosinski.com/2009/01/11/the-difference-between-Ruby-symbols -and-strings /
シンボルは、名前と文字列を表すために使用するものです。文字列を数回使用する必要がある場合は、シンボルを使用する方がはるかに簡単で生産的です。
そして、これはグーグルを介してこれを見つけました、より詳細を提供するかもしれません: ここに行く
記号と文字列は完全に異なります この投稿 は違いを少し洞察しています。いつ、どこでそれらを使用するかについては、このテーマに関するかなり広範囲にわたる投稿があります has many:through 。
対抗点として、私の友人は最近 「Ruby Rant」というタイトルの投稿 を書きました。これはRuby記号をもう一度見ます。