为什么哈希转换为符号的字符串键?

Non*_*ona 35 ruby string hash symbols literals

使用Ruby 2.3:

在示例1中,字符串键"a"自动转换为符号,而在示例2中,它保持字符串.

例1

{"a": 1}
# => {:a=>1} 
Run Code Online (Sandbox Code Playgroud)

例2

{"a"=>"c"}
# => {"a"=>"c"}
Run Code Online (Sandbox Code Playgroud)

我认为:与旧式哈希火箭=>语法相同.到底是怎么回事?为什么我在Rails中从未注意到这一点?这HashWithIndifferentAccess是否模糊了这个?

Zab*_*bba 39

在Ruby 2.3(.0)中,这些都是相同的:

{:"a" => 1}
{"a": 1},
{:a => 1}
{a: 1} 
Run Code Online (Sandbox Code Playgroud)

它们都转化为同样的东西:a在所有这些情况下都是一个符号.

{"a"=>1}不同:a在这种情况下是一个字符串.


gui*_*man 6

这是因为ruby 1.9引入了新的哈希语法.带冒号的语法仅适用于符号键.它被称为"符号对象"哈希,它只是最常见的哈希风格的语法糖.对我来说另一点,它更接近于javascript对象表示法.

如果我有混合键类型,那么我更喜欢旧样式(哈希火箭语法),但这取决于你.混合这两种风格看起来很难看.

  • 我可能还会在这里添加`{"a":1}`符号*看起来*与JSON完全相同,但不像它那样.在ruby中我们有符号,而`"a":`转换为Ruby符号(不是字符串); 在Javascript中我们没有符号,所以在`{"a":1}`的JSON版本中,"a"是一个字符串.因此,虽然有问题的Ruby哈希表示法看起来像JSON,但从技术上讲它并不相同. (6认同)
  • 这不是ruby 1.9中引入的语法. (3认同)
  • @sawa在ruby 1.9中引入了新语法,它更接近于javascript表示法. (3认同)
  • @Reyko,如果你想知道,sawa的LOL有点像[this](http://www.talkingwav.com/various/evilaugh.wav). (3认同)
  • @sawa我不需要比你更了解.我只知道基础知识 (2认同)