Ruby value of a hash key?

后端 未结 6 2131
暖寄归人
暖寄归人 2021-01-31 08:43

I\'ve got a list of values that are in a Ruby hash. Is there a way to check the value of the key and if it equals \"X\", then do \"Y\"?

I can test to see if the hash ha

6条回答
  •  执笔经年
    2021-01-31 09:05

    It seems that your question is maybe a bit ambiguous.

    If “values” in the first sentence means any generic value (i.e. object, since everything in Ruby can be viewed as an object), then one of the other answers probably tells you what you need to know (i.e. use Hash#[] (e.g. hash[some_key]) to find the value associated with a key).

    If, however, “values” in first sentence is taken to mean the value part of the “key, value pairs” (as are stored in hashes), then your question seems like it might be about working in the other direction (key for a given value).

    You can find a key that leads to a certain value with 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 
    

    If you are using a Ruby earlier than 1.9, you can use Hash#index.

    When there are multiple keys with the desired value, the method will only return one of them. If you want all the keys with a given value, you may have to iterate a bit:

    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"] 
    

    Once you have a key (the keys) that lead to the value, you can compare them and act on them with if/unless/case expressions, custom methods that take blocks, et cetera. Just how you compare them depends on the kind of objects you are using for keys (people often use strings and symbols, but Ruby hashes can use any kind of object as keys (as long as they are not modified while they serve as keys)).

提交回复
热议问题