Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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.