当我执行以下操作时:
h = { "a": 123 }
Ruby会自动将键转换为符号。
h[:a] # => 123 h["a"] # => nil
我如何防止这种行为?我用字符串键创建了散列,并希望保持这种方式,而不必总是调用Hash#stringify_keys。
Hash#stringify_keys
mm9b1k5b1#
使用哈希火箭语法:
h = { "a" => 123 } #=> {"a"=>123} h['a'] #=> 123
z18hc3ub2#
使用哈希火箭=>代替冒号:
=>
:
h = { "a" => 123 } #=> {"a"=>123}
您现在可以使用以下命令访问该值
h["a"] #=> 123
顺便说一句,如果您正在使用rails并且希望确保同时使用符号键和字符串键访问值您可以使用Hash#with_indifferent_access
Hash#with_indifferent_access
h = { a: 123 }.with_indifferent_access #=> {"a"=>123} h[:a] #=> 123 h["a"] #=> 123 h['a'] #=> 123
pepwfjgg3#
试试看
h = { "a" => 123 }
冒号使你的钥匙成为一个符号。
vwoqyblh4#
澄清误会:当字符串键被修改为符号时,会令人困惑/沮丧它一开始不是字符串,这只是创建符号键的另一种语法,请考虑:
:'foo-bar'.class # => Symbol
这个想法是,有时候,符号中可能有看起来完全不同的字符。例如,上面不带引号的代码意味着 “创建文字符号:foo,并从中减去局部变量/方法调用结果bar的值“。以前,除了使用String#to_sym之外,没有其他方法可以构造这样的符号。你必须承认,这看起来很糟糕:
:foo
bar
String#to_sym
{'foo-bar'.to_sym => 42, :this_now_needs_rocket_notation => 'baz'}
引号通常不意味着 * 字符串创建 *,它们意味着 * 照原样接受 * 和/或定义某些东西的边界。因此,它们附带地对字面字符串语法很有意义,但这不是它们唯一的应用。
4条答案
按热度按时间mm9b1k5b1#
使用哈希火箭语法:
z18hc3ub2#
使用哈希火箭
=>
代替冒号:
您现在可以使用以下命令访问该值
顺便说一句,如果您正在使用rails并且希望确保同时使用符号键和字符串键访问值
您可以使用
Hash#with_indifferent_access
pepwfjgg3#
试试看
冒号使你的钥匙成为一个符号。
vwoqyblh4#
澄清误会:
当字符串键被修改为符号时,会令人困惑/沮丧
它一开始不是字符串,这只是创建符号键的另一种语法,请考虑:
这个想法是,有时候,符号中可能有看起来完全不同的字符。
例如,上面不带引号的代码意味着 “创建文字符号
:foo
,并从中减去局部变量/方法调用结果bar
的值“。以前,除了使用String#to_sym
之外,没有其他方法可以构造这样的符号。你必须承认,这看起来很糟糕:引号通常不意味着 * 字符串创建 *,它们意味着 * 照原样接受 * 和/或定义某些东西的边界。因此,它们附带地对字面字符串语法很有意义,但这不是它们唯一的应用。