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

时间:2012-07-08 07:23:13

标签: ruby hash symbols

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

{"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

但它什么也没有返回。有什么理由可以导致这个问题吗?

6 个答案:

答案 0 :(得分:10)

使用instance["mem_usage"]代替,因为哈希不使用符号。

答案 1 :(得分:4)

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

你可能习惯在Rails中工作,其中一个非常具体的Hash变体,称为HashWithIndifferentAccess,用于诸如params之类的东西。此特定类的工作方式类似于标准的ruby Hash,除非您访问键时允许使用符号或字符串。标准的Ruby Hash,一般来说,在其他语言中使用Hash实现,期望访问元素,用于以后访问的密钥应该是与用于存储对象的密钥相同的类和值的对象。 HashWithIndifferentAccess是通过Active Support库提供的Rails便捷类。你可以自己使用它们,但首先要求它们引入它们。

HashWithIndifferentAccess只是在访问时从字符串到符号进行转换。

因此,对于您的情况,实例[“mem_usage”]。to_f应该有效。

答案 2 :(得分: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

答案 3 :(得分:1)

显然,哈希的键是字符串,因为它们周围有双引号。因此,您需要使用instance["mem_usage"]访问密钥,否则您需要首先使用符号作为密钥来构建新哈希。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

如果您将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