web-dev-qa-db-ja.com

Rubyハッシュキーの値?

Rubyハッシュにある値のリストがあります。キーの値をチェックし、それが「X」に等しい場合、「Y」を実行する方法はありますか?

hash.has_key?を使用して、ハッシュにキーがあるかどうかをテストできますが、if hash.key == "X" then...を知る必要がありますか?

29
cswebgrl

ハッシュは、角括弧([])を使用してインデックス付けされます。ちょうど配列。ただし、数値インデックスを使用してインデックスを作成する代わりに、キーに使用した文字列リテラルまたはシンボルを使用してハッシュにインデックスを作成します。あなたのハッシュが

hash = { "key1" => "value1", "key2" => "value2" }

で値にアクセスできます

hash["key1"]

またはのために

hash = { :key1 => "value1", :key2 => "value2"}

またはRuby 1.9でサポートされている新しい形式

hash = { key1: "value1", key2: "value2" }

で値にアクセスできます

hash[:key1]
55
Mircea Grelus

この質問はあいまいなようです。

リクエストの解釈を試みます。

def do_something(data)
   puts "Found! #{data}"
end

a = { 'x' => 'test', 'y' => 'foo', 'z' => 'bar' }
a.each { |key,value| do_something(value) if key == 'x' }

これは、すべてのキーと値のペアをループし、キーが「x」の場合にのみ何かを行います。

13
nolith

の追加として@Intrepiddの答えは、特定の状況では、[]の代わりにfetchを使用することです。キーが見つからないときにfetchが例外をスローしないようにするには、デフォルト値を渡します。

puts "ok" if hash.fetch('key', nil) == 'X'

参照: https://docs.Ruby-lang.org/en/2.3.0/Hash.html .

6
Felix

これはどう?

puts "ok" if hash_variable["key"] == "X"

[]演算子を使用してハッシュ値にアクセスできます

3
Intrepidd

あなたの質問は少し曖昧なようです。

最初の文の「値」が一般的な値を意味する場合(つまり、オブジェクト、Rubyのすべてがオブジェクトとして表示できるため)、他の答えの1つがおそらくあなたに必要なものを教えてくれる知っている(つまり Hash#[] (例:hash[some_key])キーに関連付けられた値を見つける)。

ただし、最初の文の「値」が「キーと値のペア」の値部分(ハッシュに格納されている)を意味する場合、あなたの質問は他の方向での作業に関するもののようです(キー指定された値)。

特定の値につながるaキーを Hash#key

Ruby-1.9.2-head :001 > hash = { :a => '1', :b => :two, :c => 3, 'bee' => :two }
 => {:a=>"1", :b=>:two, :c=>3, "bee"=>:two} 
Ruby-1.9.2-head :002 > a_value = :two
 => :two 
Ruby-1.9.2-head :003 > hash.key(a_value)
 => :b 

1.9より前のRubyを使用している場合は、 Hash#index

目的の値を持つキーが複数ある場合、メソッドはそのうちの1つのみを返します。特定の値を持つすべてのキーが必要な場合は、少し繰り返す必要があります。

Ruby-1.9.2-head :004 > hash[:b] == hash['bee']
 => true 
Ruby-1.9.2-head :005 > keys = hash.inject([]) do # all keys with value a_value
Ruby-1.9.2-head :006 >       |l,kv| kv[1] == a_value ? l << kv[0] : l
Ruby-1.9.2-head :007?>   end
 => [:b, "bee"] 

値につながるキー(キー)を取得したら、それらを比較し、if/unless/case式、ブロックを取るカスタムメソッドなど。それらを比較する方法は、キーに使用しているオブジェクトの種類に依存します(多くの場合、文字列と記号を使用しますが、Rubyハッシュは任意の種類のオブジェクトをキーとして使用できます(ただし、キーとして機能している間は変更されません))。

2
Chris Johnsen

私はあなたの問題を明確に理解していませんでしたが、これはあなたが探しているものだと思います(私の理解に基づいて)

  person =   {"name"=>"BillGates", "company_name"=>"Microsoft", "position"=>"Chairman"}

  person.delete_if {|key, value| key == "name"} #doing something if the key == "something"

  Output: {"company_name"=>"Microsoft", "position"=>"Chairman"}
2
Prabhakar