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

How to create Hash with string keys by default

当我执行以下操作时:

h = { "a": 123 }

Ruby 自动将密钥转换为符号。

h[:a]  # => 123
h["a"] # => nil

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

使用哈希火箭语法:

h = { "a" => 123 }
#=> {"a"=>123}
h['a']
#=> 123

尝试

h = { "a" => 123 }

冒号使您的钥匙成为一个符号。

使用 hashrocket 代替冒号 :

h = { "a" => 123 }
#=> {"a"=>123}

消除误会:

it's confusing/frustrating when the string key gets modified to a symbol

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

:'foo-bar'.class # => Symbol

想法是,有时符号中的某些字符看起来完全不同。

例如,上面没有引号的意思是"create the literal symbol :foo and from it, subtract the value of the local variable/method invocation result bar"。以前,除了使用 String#to_sym 之外,没有其他方法可以构造此类符号。你必须同意这看起来很糟糕:

{'foo-bar'.to_sym => 42, :this_now_needs_rocket_notation => 'baz'}

引号通常并不意味着 字符串创建 ,它们意味着 照原样 and/or 定义某物的边界。因此,它们对文字字符串语法很有意义,但这不是它们唯一的应用。