Como verificar se uma chave específica está presente em um hash ou não?

636

Quero verificar se a chave "usuário" está presente ou não no hash da sessão. Como posso fazer isso?

Observe que não quero verificar se o valor da chave é nulo ou não. Eu só quero verificar se a chave "usuário" está presente.

Mohit Jain
fonte

Respostas:

952

HashO key?método de informa se uma chave está presente ou não.

session.key?("user")
sepp2k
fonte
bonito: "string" obras do assessor para JSON.parse analisado objetos, também :)
Bijan
2
Isso não funciona para mim, a: Método de usuário trabalhou vez
Akash Agarwal
295

Enquanto Hash#has_key?faz o trabalho, como Matz observa aqui , ele foi preterido em favor de Hash#key?.

hash.key?(some_key)
Bozhidar Batsov
fonte
1
Boa referência a essa solicitação de mudança e resposta subsequente de Matz.
Joshua Pinter
alguém sabe com certeza?
precisa saber é o seguinte
41

Nas versões mais recentes do Ruby, a instância do Hash tem um key?método:

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

Certifique-se de usar a tecla de símbolo ou uma tecla de seqüência de caracteres, dependendo do que você possui no seu hash:

{'a' => 2}.key?(:a)
=> false
installero
fonte
2
Apprently existido tão cedo quanto o Ruby 1.6: ruby-doc.com/docs/ProgrammingRuby/html/... (talvez mais cedo, não sei onde para verificar documentado)
Beni Cherniavsky-Paskin
28

É muito tarde, mas de preferência os símbolos devem ser usados ​​como chave:

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 

Mas, ao criar hash, se você passar a string como chave, ele procurará a string nas chaves.

Mas ao criar o hash, você passa o símbolo como chave e has_key? procurará as teclas usando o símbolo.


Se você estiver usando o Rails, poderá Hash#with_indifferent_accessevitar isso; ambos hash[:my_key]e hash["my_key"]apontará para o mesmo registro

GB
fonte
6
Se você estiver usando o Rails, poderá Hash#with_indifferent_accessevitar isso; ambos :my_keye "my_key"irá apontar para o mesmo registro
Devon Parsons
5

Você sempre pode usar Hash#key?para verificar se a chave está presente em um hash ou não.

Caso contrário, ele retornará false

hash =  { one: 1, two:2 }

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

hash.key?(:four)
#=> false
Deepak Mahakale
fonte
3

Outra maneira é aqui

hash = {one: 1, two: 2}

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

hash.member?(:five)
#=> false
Arvind singh
fonte
0

No Rails 5, o has_key? O método verifica se a chave existe no hash. A sintaxe para usá-lo é:

YourHash.has_key? :yourkey
BinaryMan
fonte