シンボルは、識別子、または文字列の特別なバージョンのようなものです。
文字列を使用すると、次のことができます
str1 = 'SYM'
と
str2 = 'symbol'
str2 = str2[0,3].upcase
これで、メモリ内の異なる場所に2 つの同一の文字列が存在します。Ruby はすべての文字を比較して評価する必要がありstr1 == str2
ます。
ただし、シンボルは一意です。それらに対して文字操作を行うことはできません。
sym1 = :SYM
sym2 = :SYM
その場合、1 回の比較だけでそれらが等しいかどうかをテストできます。文字列とシンボルのオブジェクト ID を見ると、これが明確に示されています。
puts str2.object_id
puts str1.object_id
puts sym1.object_id
puts sym2.object_id
puts str1.to_sym.object_id
puts str2.to_sym.object_id
出力
22098264
22098228
203780
203780
203780
203780
したがって、2 つの文字列のオブジェクト ID は異なりますが、2 つのシンボルは実際には同じオブジェクトです。2 つの文字列をシンボルに変換しても、同じオブジェクト ID が得られるため、 1 つ しかありません:SYM
。
記号は値:north = 1
なので、そのまま書いても意味がありません'north' = 1
。
文字列をシンボルと比較すると、 like'north' = :north
は常に を返しfalse
ます。これらは異なるクラスのオブジェクトであるためです。
param[:name]
任意のオブジェクトでハッシュをインデックス化できるという理由だけで機能します。(あなたは言うことができます。)それは(リテラル文字列によるハッシュのインデックス付け)または(変数の内容param[Object.new] = 1
によるハッシュのインデックス付け)のいずれかを書くこととは異なります。param['name']
param[name]
name
これはあなたの質問に答えていますか?