2012-07-08 2 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 같은 것들에 사용되는 레일 내에서 작업하는 데 사용됩니다. 이 특정 클래스는 심볼이나 문자열을 사용할 수있는 키에 액세스 할 때를 제외하고 표준 루비 해시처럼 작동합니다. 표준 Ruby 해시 및 일반적으로 다른 언어의 해시 구현에서는 요소에 액세스하기 위해 나중에 액세스 할 때 사용되는 키가 객체를 저장하는 데 사용 된 키와 동일한 클래스 및 값의 객체 여야합니다. HashWithIndifferentAccess는 Active Support 라이브러리를 통해 제공되는 Rails 편의 클래스입니다. 당신은 당신 자신을 자유롭게 사용할 수 있지만, 먼저 그들을 요구함으로써 데려 왔습니다.

HashWithIndifferentAccess는 액세스 시간에 문자열에서 기호로 변환하기 만합니다.

귀하의 경우 인스턴스 [ "mem_usage"]. to_f가 작동해야합니다.

1

또한 도움이 될 수있는 symbolize_keysstringify_keys 옵션이 있습니다. 메소드 이름은 충분히 자기 설명 적입니다.

관련 문제