ruby 符号作为键,但无法从哈希中获取值

Posted

技术标签:

【中文标题】ruby 符号作为键,但无法从哈希中获取值【英文标题】:ruby symbol as key, but can't get value from hash 【发布时间】:2012-07-08 01:06:29 【问题描述】:

我正在对其他人的代码进行一些更新,现在我有一个哈希,就像:

"instance_id"=>"74563c459c457b2288568ec0a7779f62", "mem_quota"=>536870912, "disk_quota"=>2147483648, "mem_usage"=>59164.0, "cpu_usage"=>0.1, "disk_usage"=>6336512

我想通过符号作为键来获取值,例如::mem_quota,但是失败了。

代码如下:

instance[:mem_usage].to_f

但它什么也不返回。有什么原因会导致这个问题吗?

【问题讨论】:

【参考方案1】:

改用instance["mem_usage"],因为哈希没有使用符号。

【讨论】:

【参考方案2】:

其他解释是正确的,但要给出更广泛的背景:

您可能习惯于在 Rails 中工作,其中一个非常特殊的 Hash 变体,称为 HashWithIndifferentAccess,用于诸如参数之类的事情。这个特殊的类就像一个标准的 ruby​​ 哈希,除了当你访问键时,你可以使用符号或字符串。标准的 Ruby Hash,一般来说,其他语言中的 Hash 实现,期望访问一个元素,用于以后访问的键应该是与用于存储对象的键具有相同类和值的对象。 HashWithIndifferentAccess 是通过 Active Support 库提供的 Rails 便利类。您可以自己使用它们,但首先需要它们才能引入它们。

HashWithIndifferentAccess 只是在访问时为您完成从字符串到符号的转换。

因此,对于您的情况, instance["mem_usage"].to_f 应该可以工作。

【讨论】:

【参考方案3】:

你需要 HashWithIndifferentAccess。

require 'active_support/core_ext'

h1 = "instance_id"=>"74563c459c457b2288568ec0a7779f62", "mem_quota"=>536870912, 
  "disk_quota"=>2147483648, "mem_usage"=>59164.0, "cpu_usage"=>0.1, 
  "disk_usage"=>6336512

h2 = h1.with_indifferent_access

h1[:mem_usage] # => nil
h1["mem_usage"] # => 59164.0

h2[:mem_usage] # => 59164.0
h2["mem_usage"] # => 59164.0

【讨论】:

【参考方案4】:

另外,symbolize_keysstringify_keys 选项可能会有所帮助。我相信方法名称足够自我描述。

【讨论】:

【参考方案5】:

很明显,哈希的键是字符串,因为它们周围有双引号。因此,您需要使用instance["mem_usage"] 访问密钥,或者您需要先构建一个以符号作为密钥的新哈希。

【讨论】:

【参考方案6】:

如果您将 Rails 与 ActiveSupport 一起使用,请务必使用 HashWithIndifferentAccess 以灵活地使用字符串或符号访问哈希。

hash = HashWithIndifferentAccess.new(
  "instance_id"=>"74563c459c457b2288568ec0a7779f62", 
  "mem_quota"=>536870912, "disk_quota"=>2147483648, 
  "mem_usage"=>59164.0, 
  "cpu_usage"=>0.1, 
  "disk_usage"=>6336512
)

hash[:mem_usage] # => 59164.0
hash["mem_usage"] # => 59164.0

【讨论】:

以上是关于ruby 符号作为键,但无法从哈希中获取值的主要内容,如果未能解决你的问题,请参考以下文章

ruby 哈希,其中键来自数组,值作为默认值

从以数组为值的哈希中获取数组

如何将带有对象作为键的 Ruby 哈希对象作为 Map 对象发送到前端 Javascript

使用类常量作为 Ruby 哈希键

如何找到包含匹配值的哈希键

哈希键的Ruby值?