4

引用符を使用して文字列を初期化することと、前にコロンを付けることの違いは何ですか? つまり、「bobo」と :bobo です。それらを検査すると同じように見えますが、それらを比較すると、結果は false と評価されます。

irb(main):006:0> r = "bobo"
=> "bobo"
irb(main):007:0> puts r
bobo
=> nil
irb(main):008:0> t = :bobo
=> :bobo
irb(main):009:0> puts t
bobo
=> nil
irb(main):010:0> puts r == t
false
=> nil
irb(main):011:0> s = "bobo"
=> "bobo"
irb(main):012:0> puts r == s
true
=> nil
4

5 に答える 5

9

「bobo」は文字列ですが、:boboは記号です。

:bobo.class # => Symbol
"bobo".class # => String

String#==

obj が文字列でない場合、false を返します。それ以外の場合、str <=> obj がゼロを返す場合は true を返します。

したがって、ドキュメント"bobo" == :bobo # => false"bobo" == "bobo" # => true. - これは想定内です。

puts :bobo 
# >> bobo
:bobo.to_s # => "bobo"

これはSymbol オブジェクトにputs適用するためです。見るto_s:boboSymbol#to_s

于 2013-07-01T04:39:04.370 に答える
5

次の点に注意してください。

"foo".object_id
 => 70353007334300
"foo".object_id
 => 70353007354360
:foo.object_id
 => 413928
:foo.object_id
 => 413928

シンボルは(同じ)キャッシュされobject_idますが、文字列は毎回インスタンス化されます。パフォーマンスの知識のためにこれを覚えておいてください。また、ガベージコレクターにも注意してください;)

于 2013-07-01T07:12:14.547 に答える
4

コロンで始まるStringのようなものはSymbolです:

:bobo.class
# => Symbol
"bobo".class
# => String

あなたがinspectそれらをするとき、それらは異なって見えます:

:bobo.inspect
# => ":bobo"
"bobo".inspect
# => "\"bobo\""

それらを印刷すると、putsそれらは同じように見えます。これは、その引数をputs呼び出し、 を返すためです。to_s:bobo.to_s"bobo"

:bobo.to_s
# => "bobo"
:bobo.to_s == "bobo"
# => true

違いとシンボルの使用方法をよりよく理解したい場合は、Ruby チュートリアルと同様に、上記にリンクされているドキュメントを熟読することから始めることをお勧めします。この記事も読む価値があります: The Difference Between Ruby Symbols and Strings

于 2013-07-01T04:46:22.633 に答える
3

おっしゃる通り「コロン付きの文字列」は記号です。文字列に似ていますが、シンボルは不変です。変更可能なオブジェクトは、割り当て後に変更できます。不変オブジェクト (:シンボル) は、割り当て後に変更できません。上書きのみ可能です。Ruby はユニークで非常に動的な言語であるため、実行時に変化する可能性があり、実際に変化することがよくあります。シンボルはより厳密であり、実行時に予期せず変更されることはありません。

于 2013-07-01T04:40:31.293 に答える
2

シンボルと文字列の主な違いは、メモリ割り当てと可変性です。文字列はいつでも変更できます。

'prasad' << 'surase' => "prasadsurase" 
:prasad << 'surase'
NoMethodError: undefined method `<<' for :prasad:Symbol

また、同じ値を持つ 2 つの文字列 (たとえば、'prasad' と 'prasad') には、2 つの異なるメモリ位置があり、異なるオブジェクト ID があります。

'prasad'.object_id => 102809450 
'prasad'.object_id => 102894570 
'prasad'.object_id => 103057580 

一方、オブジェクトは 1 つしかないため、2 つの同じシンボルは同じであり、同じメモリ位置を持ちます。

:prasad.object_id => 2358408 
:prasad.object_id => 2358408 
:prasad.object_id => 2358408 

また、文字列が作成されたとき、参照されていないときはメモリ n を割り当てる必要があり、ガベージ コレクションが必要ですが、シンボルはプログラムの操作中ずっとメモリに残り、参照されていないときはガベージ コレクションされません。これは、プログラムのパフォーマンスに影響します。宣言されたすべてのシンボルを次のように収集できます

Symbol.all_symbols.include?(:prasad) => true
于 2013-07-01T11:41:16.123 に答える