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

他の説明は正しいですが、より広い背景を与えるために:

おそらく、HashWithIndifferentAccessと呼ばれるHashの非常に特殊なバリアントがparamsなどに使用されるRails内での作業に慣れているでしょう。この特定のクラスは、キーにアクセスするときにシンボルまたは文字列のいずれかを使用できることを除いて、標準のルビーハッシュのように機能します。標準のRubyハッシュ、および一般的に言えば、他の言語のハッシュ実装では、要素にアクセスするために、後でアクセスするために使用されるキーは、オブジェクトの格納に使用されるキーと同じクラスおよび値のオブジェクトである必要があります。HashWithIndifferentAccessは、アクティブサポートライブラリを介して提供される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 に答える
1

ハッシュのキーは二重引用符で囲まれているため、明らかに文字列です。したがって、キーにアクセスするinstance["mem_usage"]か、最初にシンボルをキーとして新しいハッシュを作成する必要があります。

于 2012-07-08T07:25:13.713 に答える