Как проверить, присутствует ли определенный ключ в хэше или нет?

636

Я хочу проверить, присутствует ли ключ пользователя в хэше сеанса. Как я могу это сделать?

Обратите внимание, что я не хочу проверять, является ли значение ключа нулевым или нет. Я просто хочу проверить, присутствует ли «пользовательский» ключ .

Мохит Джайн
источник

Ответы:

952

Hash«S key?метод говорит вам , присутствует ли или нет данный ключ.

session.key?("user")
sepp2k
источник
приятно: аксессор "string" работает и для анализируемых объектов JSON.parse :)
Bijan
2
У меня это не работает, вместо этого работал метод user
Акаш Агарвал
295

В то время как Hash#has_key?получает работу, а Мац отмечает здесь , он устарел в пользу Hash#key?.

hash.key?(some_key)
Божидар Бацов
источник
1
Хорошая ссылка на этот запрос на изменение и последующий ответ от Маца.
Джошуа Пинтер
Кто-нибудь знает наверняка?
Codeforester
41

В последних версиях Ruby экземпляр Hash имеет key?метод:

{a: 1}.key?(:a)
=> true

Обязательно используйте символьный ключ или строковый ключ в зависимости от того, что у вас есть в хэше:

{'a' => 2}.key?(:a)
=> false
installero
источник
2
По-видимому, существовал уже в Ruby 1.6: ruby-doc.com/docs/ProgrammingRuby/html/… (возможно, раньше, не знаю, где проверить документально)
Бени Чернявский-Паскин
28

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

my_hash = {}
my_hash[:my_key] = 'value'

my_hash.has_key?("my_key")
 => false 
my_hash.has_key?("my_key".to_sym)
 => true 

my_hash2 = {}
my_hash2['my_key'] = 'value'

my_hash2.has_key?("my_key")
 => true 
my_hash2.has_key?("my_key".to_sym)
 => false 

Но при создании хэша, если вы передадите строку в качестве ключа, он будет искать строку в ключах.

Но при создании хеша вы передаете символ как ключ, затем has_key? будет искать ключи с помощью символа.


Если вы используете Rails, вы можете использовать, Hash#with_indifferent_accessчтобы избежать этого; оба hash[:my_key]и hash["my_key"]будут указывать на одну и ту же запись

гигабайт
источник
6
Если вы используете Rails, вы можете использовать, Hash#with_indifferent_accessчтобы избежать этого; и то :my_keyи другое "my_key"будет указывать на одну и ту же запись
Девон Парсонс
5

Вы всегда можете использовать, Hash#key?чтобы проверить, присутствует ли ключ в хэше или нет.

Если нет, он вернет вас false

hash =  { one: 1, two:2 }

hash.key?(:one)
#=> true

hash.key?(:four)
#=> false
Дипак Махакале
источник
3

Другой способ здесь

hash = {one: 1, two: 2}

hash.member?(:one)
#=> true

hash.member?(:five)
#=> false
Арвинд Сингх
источник
0

В Rails 5 ключ has_key? Метод проверяет, существует ли ключ в хэше. Синтаксис, чтобы использовать это:

YourHash.has_key? :yourkey
BinaryMan
источник