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

548

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

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

Теги:
data-structures
associative-array

6 ответов

781
Лучший ответ

Hash key? указывает, присутствует ли данный ключ или нет.

session.key?("user")
  • 0
    приятно: аксессор "string" работает и для анализируемых объектов JSON.parse :)
  • 2
    Это не работает для меня, вместо этого работал метод: user
264

Пока Hash#has_key? выполняет свою работу, так как Matz отмечает здесь, он устарел в пользу Hash#key?.

hash.key?(some_key)
  • 1
    Хорошая ссылка на этот запрос на изменение и последующий ответ от Маца.
  • 0
    Кто-нибудь знает наверняка?
32

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

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

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

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

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

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"] будут указывать на одну и ту же запись

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

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

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

hash =  { one: 1, two:2 }

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

hash.key?(:four)
#=> false
0

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

hash = {one: 1, two: 2}

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

hash.member?(:five)
#=> false

Ещё вопросы

Сообщество Overcoder
Наверх
Меню