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

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

4

6 回答 6

10

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

于 2012-07-08T07:25:17.430 回答
7

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

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

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

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

于 2012-07-08T15:45:23.507 回答
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
于 2012-07-08T08:31:15.493 回答
3

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

于 2017-12-21T08:21:11.493 回答
1

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

于 2012-07-08T07:25:13.713 回答
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
于 2019-01-24T02:19:22.700 回答