ハッシュキーに文字列を使ってるのか、シンボルを使ってるのか、ちゃんと区別しといたほうがいい
最近ちょっと悩んだ、ハッシュのキーに関して
irb > { 'my-key' => '111' } == { 'my-key': '111' }
# => false
で、「え!!?」となって驚いた話。
{ 'my-key' => '111' }
文字列 'my-key'
をキーとするハッシュ
{ 'my-key': '111' }
シンボル :'my-key'
をキーとするハッシュ
ハイフンやスペースが入った文字列をハッシュのキーにしたい時
ハイフンやスペースが入ってる場合、前置きコロンでサクッとシンボルにできない。
{ 'my-key': '111' }
みたいにわざわざシンボルに変換せず、文字列のまま使ったほうがわかりやすい。
あとでアクセスする時もキーが:'my-key'
になっちゃってややこしいから・・
ここから、自分的復習ポイント。
ハッシュのキーはシンボルと文字列を区別している
「シンボルと文字列は違う」ため、ハッシュのキーとして使うときに区別される。
irb> hash1 = { "one" => "uno", "two" => "dos" }
=> {"one"=>"uno", "two"=>"dos"}
irb> hash2 = { :one => "uno", :two => "dos" }
=> {:one=>"uno", :two=>"dos"}
irb0> hash1 == hash2
=> false
irb> hash1["one"]
=> "uno"
irb> hash1[:one]
=> nil
hash1は文字列がキーに、hash2はシンボルがキー。
hash1の値を取りたいときに、シンボルの :one
を渡しても取れない。(シンボルと文字列は違うものだから)
ハッシュの省略記法
ハッシュにはよく シンボルがキーとして使われる ため、 Ruby1.9より省略記法が導入されている。
irb> hash3 = { one: "uno", two: "dos" }
=> {:one=>"uno", :two=>"dos"}
irb> hash2 == hash3
=> true
後ろコロン・・・
これは、 シンボルをキーとしたハッシュを作るための省略記法
機械的に、「ハッシュ作る時のキーは後ろコロン」だけ覚えてたら、最初に書いた問題にぶち当たった。
後ろコロンで作られたハッシュのキーはシンボルである。
ハイフンやスペースが入ったサクッとシンボルにならない文字列の場合、ややこしくなるので、文字列のまま { 'my-key' => '111' }
とするのが吉。