Ruby значение хеш-ключа? - PullRequest
       32

Ruby значение хеш-ключа?

29 голосов
/ 20 февраля 2011

У меня есть список значений в хэше Ruby. Есть ли способ проверить значение ключа и, если оно равно «X», то сделать «Y»?

Я могу проверить, есть ли у хэша ключ, используя hash.has_key?, но теперь мне нужно знать if hash.key == "X" then...?

Ответы [ 6 ]

54 голосов
/ 20 февраля 2011

Хэши индексируются с помощью квадратных скобок ([]).Так же, как массивы.Но вместо индексации с помощью числового индекса хэши индексируются с использованием строкового литерала, который вы использовали для ключа, или символа.Таким образом, если ваш хэш похож на

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

, вы можете получить доступ к значению с помощью

hash["key1"]

или для

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

или нового формата, поддерживаемого в Ruby 1.9

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

Вы можете получить доступ к значению с помощью

hash[:key1]
13 голосов
/ 09 марта 2012

Этот вопрос кажется неоднозначным.

Я попробую с моей интерпретацией запроса.

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' }

Это зациклит все ключи, пары значений и только что-то сделаетесли ключ «х».

6 голосов
/ 15 ноября 2016

В качестве дополнения, например, к ответу @Intrepidd, в некоторых ситуациях вы хотите использовать fetch вместо [].Чтобы fetch не генерировал исключение, когда ключ не найден, передайте ему значение по умолчанию.

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

Ссылка: https://docs.ruby -lang.org / ru / 2.3.0 /Hash.html .

3 голосов
/ 20 февраля 2011

Как насчет этого?

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

Вы можете получить доступ к значениям хеша с помощью оператора []

2 голосов
/ 15 декабря 2014

Я не совсем понял вашу проблему, но думаю, это то, что вы ищете (основываясь на моем понимании)

  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 голосов
/ 20 февраля 2011

Кажется, что ваш вопрос может быть немного двусмысленным.

Если «значения» в первом предложении означают какое-либо общее значение (т. Е. Объект, поскольку все в 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 могут использовать любой тип объектов в качестве ключей (если они не изменяются, пока служат ключами)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...