Значение Ruby хэш-ключа?
У меня есть список значений, которые находятся в хеше Ruby. Есть ли способ проверить значение ключа, и если он равен "X", тогда выполните "Y"?
Я могу проверить, имеет ли хэш ключ с помощью hash.has_key?
, но теперь мне нужно знать if hash.key == "X" then...
?
Ответы
Ответ 1
Хэши индексируются с использованием квадратных скобок ([]). Как массивы. Но вместо индексации с числовым индексом хэши индексируются с использованием либо строкового литерала, который вы использовали для ключа, либо символа.
Поэтому, если ваш хэш похож на
hash = { "key1" => "value1", "key2" => "value2" }
вы можете получить доступ к значению с помощью
hash["key1"]
или для
hash = { :key1 => "value1", :key2 => "value2"}
или новый формат, поддерживаемый в Ruby 1.9
hash = { key1: "value1", key2: "value2" }
вы можете получить доступ к значению с помощью
hash[:key1]
Ответ 2
Этот вопрос кажется неоднозначным.
Я попробую с моей интерпретацией запроса.
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".
Ответ 3
Как насчет этого?
puts "ok" if hash_variable["key"] == "X"
Вы можете получить доступ к хэш-значениям с помощью оператора []
Ответ 4
Кажется, что ваш вопрос может быть немного неоднозначным.
Если "значения" в первом предложении означают любое общее значение (т.е. объект, поскольку все в 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 могут использовать любой тип объектов в качестве ключей (если они не изменяются, пока они служат в качестве ключей)).
Ответ 5
Я не понимаю вашу проблему четко, но я думаю, что это то, что вы ищете (исходя из моего понимания)
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"}
Ответ 6
В качестве дополнения к, например, Ответ @Intrepidd, в определенных ситуациях вы хотите использовать fetch
вместо []
. Чтобы fetch
не выдавать исключение, когда ключ не найден, передайте ему значение по умолчанию.
puts "ok" if hash.fetch('key', nil) == 'X'
Ссылка: https://docs.ruby-lang.org/en/2.3.0/Hash.html.