Кажется, что ваш вопрос может быть немного двусмысленным.
Если «значения» в первом предложении означают какое-либо общее значение (т. Е. Объект, поскольку все в Ruby можно рассматривать как объект), тогда одиниз других ответов, вероятно, говорит вам, что вам нужно знать (например, используйте Hash#[]
(например, hash[some_key]
), чтобы найти значение, связанное с ключом).
Если, однако,«Значения» в первом предложении означают часть значения «ключ, пары значений» (которые хранятся в хешах), тогда ваш вопрос, похоже, касается работы в другом направлении (ключ для заданного значения).
Вы можете найти ключ , который приводит к определенному значению с помощью 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
Если вы используете Rubyранее, чем 1.9, вы можете использовать Hash#index
.
Когда имеется несколько ключей с желаемым значением, метод вернет только один из них.Если вам нужны все ключи с заданным значением, вам может потребоваться выполнить итерацию:
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 могут использовать любой тип объектов в качестве ключей (если они не изменяются, пока служат ключами)).