Chcę sprawdzić, czy klucz „użytkownika” jest obecny, czy nie w skrócie sesji. W jaki sposób mogę to zrobić?
Zauważ, że nie chcę sprawdzać, czy wartość klucza wynosi zero, czy nie. Chcę tylko sprawdzić, czy klucz „użytkownika” jest obecny.
Chcę sprawdzić, czy klucz „użytkownika” jest obecny, czy nie w skrócie sesji. W jaki sposób mogę to zrobić?
Zauważ, że nie chcę sprawdzać, czy wartość klucza wynosi zero, czy nie. Chcę tylko sprawdzić, czy klucz „użytkownika” jest obecny.
Odpowiedzi:
Hash
„s key?
metoda wskazuje, czy dany klucz jest obecny czy nie.
session.key?("user")
Chociaż Hash#has_key?
praca jest wykonywana, jak zauważa tutaj Matz , została wycofana na korzyść Hash#key?
.
hash.key?(some_key)
W najnowszych wersjach Ruby instancja Hash ma key?
metodę:
{a: 1}.key?(:a)
=> true
Pamiętaj, aby użyć klucza symbolu lub klucza łańcucha w zależności od tego, co masz w swoim skrócie:
{'a' => 2}.key?(:a)
=> false
Jest bardzo późno, ale najlepiej użyć symboli jako klucza:
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
Ale podczas tworzenia skrótu, jeśli podasz ciąg jako klucz, wówczas wyszuka ciąg w kluczach.
Ale podczas tworzenia skrótu przekazujesz symbol jako klucz, a następnie has_key? przeszuka klucze za pomocą symbolu.
Jeśli używasz Railsów, możesz użyć, Hash#with_indifferent_access
aby tego uniknąć; zarówno hash[:my_key]
i hash["my_key"]
skieruje do tego samego rekordu
Hash#with_indifferent_access
aby tego uniknąć; oba :my_key
i "my_key"
będzie wskazywać na ten sam rekord
Zawsze możesz użyć, Hash#key?
aby sprawdzić, czy klucz jest obecny w haszu, czy nie.
Jeśli nie, to ci zwróci false
hash = { one: 1, two:2 }
hash.key?(:one)
#=> true
hash.key?(:four)
#=> false
Inny sposób jest tutaj
hash = {one: 1, two: 2}
hash.member?(:one)
#=> true
hash.member?(:five)
#=> false