Rubyでは、空の配列やハッシュに対してこれらの2つの操作が異なるのはなぜですか?なぜ、空の配列とハッシュは、文字列にキャストしてからシンボルにキャストするときに違った扱いになるのですか?
空の配列:
[].to_s.to_sym => :[]
空ハッシュ:
{}.to_s.to_sym => :"{}"
Rubyでは、空の配列やハッシュに対してこれらの2つの操作が異なるのはなぜですか?なぜ、空の配列とハッシュは、文字列にキャストしてからシンボルにキャストするときに違った扱いになるのですか?
空の配列:
[].to_s.to_sym => :[]
空ハッシュ:
{}.to_s.to_sym => :"{}"
実際には違うわけではありません。違った表示をしているだけです。 {
文字はシンボルの先頭にすることはできないので、引用符で囲みます。 -
のシンボルを作成したい場合は、減算演算子として解釈されるため、これと同じことです。実際には、IRBに行き、引用符が実際にシンボルに影響を与えないことをテストすることができます。
:[] == :"[]" #=> true
ので、基本的には、一つは短い形式を使用することができ、もう一方はパーサがそれを理解できるように、より冗長にする必要があります。しかし、2つの意味や形には本質的な違いはありません。
[]の文字列表現は{} "}、{" での "[]" との文字列表現であるため。ちなみに、:[]
は:"[]"
に等しい。違いは、シンボル:"[]"
をかっこなしで書くことができますが、:"{}"
の場合は実行できません。Rubyの構文では禁止されています。
引用符で囲まれたシンボルリテラルは、補間を直接使ってシンボルを構築する場合にも便利です。 'foo = 42; p: "@#{foo}" == "@#{foo}"。to_sym#=> true' – Phrogz