默认情况下如何使用字符串键创建哈希
Posted
技术标签:
【中文标题】默认情况下如何使用字符串键创建哈希【英文标题】:How to create Hash with string keys by default 【发布时间】:2017-03-03 12:35:00 【问题描述】:当我执行以下操作时:
h = "a": 123
Ruby 自动将键转换为符号。
h[:a] # => 123
h["a"] # => nil
如何防止这种行为?我使用字符串键创建了哈希,并希望保持这种状态,而不必总是调用Hash#stringify_keys
。
【问题讨论】:
key: value
只是 :key => value
的快捷方式,因此在您的示例中实际上没有字符串键 - "a": 123
变为 :"a" => 123
(注意前导 :
)
如果 "a": 123 在底层使用 HashWithIndifferentAccess 可能会更好,而不是 Hash。
@Joerg:欢迎您提交功能请求 :)
@SergioTulentsev 请停止提供这样的建议。 HashWithIndifferentAccess
与 ruby 无关 :)
@mudasobwa: 你知道我知道 :)
【参考方案1】:
使用哈希火箭语法:
h = "a" => 123
#=> "a"=>123
h['a']
#=> 123
【讨论】:
@Joerg 这是新哈希符号出现之前的样子。 是的,我知道......但是自从有了新的符号 - 没有回头路了:) @Joerg 如果您想将某个对象作为键怎么办? Object.new => :hello
- 没有办法用新的形式写出来,所以。新语法仅适用于符号键,其他一切都需要采用旧方式。
Hashrocket 不会去任何地方。而且,它看起来很酷:)
@SergioTulentsev 顺便说一句,使用带有连字的正确字体(如 Hasklig)让 hashrockets 看起来真的很酷。【参考方案2】:
试试
h = "a" => 123
冒号让你的钥匙成为一个符号。
【讨论】:
可惜……这么丑的符号……:(【参考方案3】:使用 hashrocket 代替冒号 :
h = "a" => 123
#=> "a"=>123
【讨论】:
【参考方案4】:为了消除误解:
当字符串键被修改为符号时会让人感到困惑/沮丧
这不是一个字符串开头。这只是创建符号键的另一种语法。考虑:
:'foo-bar'.class # => Symbol
这个想法是,有时,符号中的字符可能看起来完全不同。
例如,上面没有引号的意思是“创建文字符号:foo
并从中减去局部变量/方法调用结果bar
的值”。以前,除了使用String#to_sym
之外,没有其他方法可以构造此类符号。你必须同意这看起来很糟糕:
'foo-bar'.to_sym => 42, :this_now_needs_rocket_notation => 'baz'
一般来说,引号并不意味着创建字符串,它们意味着按原样和/或为某事定义边界。因此,它们偶然对文字字符串语法很有意义,但这不是它们唯一的应用。
【讨论】:
以上是关于默认情况下如何使用字符串键创建哈希的主要内容,如果未能解决你的问题,请参考以下文章