【问题标题】:ruby symbol as key, but can't get value from hashruby 符号作为键,但无法从哈希中获取值
【发布时间】: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

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

【问题讨论】:

    标签: ruby hash symbols


    【解决方案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
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-07-01
                • 2019-11-21
                • 2012-01-01
                • 1970-01-01
                • 2014-10-05
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多