默认情况下如何使用字符串键创建哈希

Joe*_*erg 12 ruby string syntax symbols ruby-on-rails

当我执行以下操作时:

h = { "a": 123 }
Run Code Online (Sandbox Code Playgroud)

Ruby/Rails会自动将密钥转换为符号.

h[:a]  # => 123
h["a"] # => nil
Run Code Online (Sandbox Code Playgroud)

我该如何防止这种行为?我用字符串键创建了哈希,并希望保持这种方式而不必总是调用Hash#stringify_keys.

And*_*eko 20

使用哈希火箭语法:

h = { "a" => 123 }
#=> {"a"=>123}
h['a']
#=> 123
Run Code Online (Sandbox Code Playgroud)

  • Hashrocket不会去任何地方.而且,它看起来很酷:) (7认同)
  • @SergioTulentsev BTW,使用带有连字的正确字体(如[Hasklig](https://github.com/i-tu/Hasklig/))使得hashrockets看起来非常酷. (4认同)

Dee*_*ale 7

使用 hashrocket 代替冒号 :

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


Urs*_*sus 6

尝试

h = { "a" => 123 }
Run Code Online (Sandbox Code Playgroud)

冒号让你的钥匙成为一个符号。

  • 可惜……这么难看的符号……:( (6认同)

ndn*_*kov 5

澄清一个误会:

当字符串键被修改为符号时,这是令人困惑/令人沮丧的

它一开始就不是一个字符串。这只是创建符号键的另一种语法。考虑:

:'foo-bar'.class # => Symbol
Run Code Online (Sandbox Code Playgroud)

这个想法是,有时,符号中的字符可能看起来完全不同。

例如,上面不带引号的意思是“创建文字符号:foo,并从中减去局部变量/方法调用结果的值bar。以前,除了使用 之外,没有其他方法可以构造此类符号String#to_sym。你必须承认这看起来很糟糕:

{'foo-bar'.to_sym => 42, :this_now_needs_rocket_notation => 'baz'}
Run Code Online (Sandbox Code Playgroud)

一般来说,引号并不意味着字符串创建,它们意味着按原样使用和/或定义某些内容的边界。因此,它们对于文字字符串语法来说很有意义,但这并不是它们唯一的应用。