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

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'

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

【讨论】:

以上是关于默认情况下如何使用字符串键创建哈希的主要内容,如果未能解决你的问题,请参考以下文章

哈希表调整大小:我们如何在不知道密钥的情况下做到这一点?

如何更改哈希映射中键的值? [复制]

在啥情况下我应该使用尝试而不是二叉树/哈希表? [复制]

Compact Framework - 如何在没有默认构造函数的情况下动态创建类型?

如何实现具有两个或更多键的哈希函数?

默认的 Kafka 分区器创建哈希键冲突