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

4

我正在修改别人的代码,现在我有一个哈希值,像这样:

{"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个回答

10

由于哈希表没有使用符号,请使用 instance["mem_usage"]


7
其他解释是正确的,但为了提供更广泛的背景知识:
您可能习惯于在Rails中工作,那里使用了一个名为HashWithIndifferentAccess的非常特殊的哈希变体,用于像params这样的东西。这个特定的类就像标准的Ruby哈希一样工作,除了当您访问键时,您可以使用符号或字符串。标准的Ruby哈希,一般来说,其他语言中的哈希实现都期望访问元素时使用的键应该是与用于存储对象的键相同类和值的对象。HashWithIndifferentAccess是通过Active Support库提供的Rails便利类。您可以自由地使用它们,但必须先通过需要它们来引入它们。
HashWithIndifferentAccess只是在访问时将字符串转换为符号。
因此,在您的情况下,instance["mem_usage"].to_f应该有效。

5
你需要使用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"]访问键,或者首先构建一个以符号作为键的新哈希表。


0
如果您使用带有ActiveSupport的Rails,则可以使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接