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?
In Ruby 2.3(.0), these are all the same:
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.According to Ruby documentation:
This means that running:
Will produce the same result:
It's because of the new hash syntax introduced with ruby 1.9. The syntax with colon works with symbol keys only. It's called a "symbol to object" hash and it's only syntactic sugar for the most common style of hashes out there. Another point for me, it's closer to the javascript object notation.
If I have mixed key types then I prefer the old style (hash-rocket syntax), but that's up to you. Mixing the two style looks ugly to me.