2012-07-08 48 views
1

我做其他人的一些代码更新,但现在我有一个散列获得价值,它是这样的:红宝石符号作为重点,但不能从哈希

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

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

回答

9

改为使用instance["mem_usage"],因为散列不使用符号。

1

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

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

其他的解释是正确的,但给一个更广阔的背景:

你可能使用到哈希的一个非常具体的变种,称为HashWithIndifferentAccess,被用于诸如PARAMS Rails的范围内工作。这个特定的类就像一个标准的红宝石哈希,除非你访问键时允许使用符号或字符串。标准的Ruby Hash,一般来说,其他语言的Hash实现期望访问元素时,用于以后访问的密钥应该是与用于存储对象的密钥相同的类和值的对象。 HashWithIndifferentAccess是通过Active Support库提供的Rails便利类。你可以自由使用它们,但是首先需要它们来引入它们。

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

因此,您的情况,实例[“mem_usage”]。to_f应该工作。