ruby 如何创建默认为字符串键的哈希

xuo3flqw  于 2023-01-04  发布在  Ruby
关注(0)|答案(4)|浏览(163)

当我执行以下操作时:

h = { "a": 123 }

Ruby会自动将键转换为符号。

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

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

mm9b1k5b

mm9b1k5b1#

使用哈希火箭语法:

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

z18hc3ub2#

使用哈希火箭=>代替冒号:

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

您现在可以使用以下命令访问该值

h["a"]
#=> 123

顺便说一句,如果您正在使用rails并且希望确保同时使用符号键和字符串键访问值
您可以使用Hash#with_indifferent_access

h = { a: 123 }.with_indifferent_access
#=> {"a"=>123}

h[:a]
#=> 123
h["a"]
#=> 123
h['a']
#=> 123
pepwfjgg

pepwfjgg3#

试试看

h = { "a" => 123 }

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

vwoqyblh

vwoqyblh4#

澄清误会:
当字符串键被修改为符号时,会令人困惑/沮丧
它一开始不是字符串,这只是创建符号键的另一种语法,请考虑:

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

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

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

引号通常不意味着 * 字符串创建 *,它们意味着 * 照原样接受 * 和/或定义某些东西的边界。因此,它们附带地对字面字符串语法很有意义,但这不是它们唯一的应用。

相关问题