2012-07-08 49 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應該工作。