Why is this string key in a hash converted to a symbol?

Nona picture Nona · Apr 9, 2016 · Viewed 21.7k times · Source

Using Ruby 2.3:

In example 1, the string key "a" is automatically converted to a symbol, whereas with example 2, it stays a string.

Example 1

{"a": 1}
# => {:a=>1} 

Example 2

{"a"=>"c"}
# => {"a"=>"c"}

I thought : was the same as the old style hash rocket => syntax. What is going on? Why have I never noticed this in Rails? Is it the HashWithIndifferentAccess that is obscuring this?

Answer

Zabba picture Zabba · Apr 9, 2016

In Ruby 2.3(.0), these are all the same:

{:"a" => 1}
{"a": 1},
{:a => 1}
{a: 1} 

They all translate to the same thing: a is a symbol in all these cases.

{"a"=>1} is different: a is a string in this case.