关于rails上的ruby:如何检查散列中是否存在特定键?

How to check if a specific key is present in a hash or not?

我想检查会话哈希中是否存在"用户"密钥。我该怎么做?

注意,我不想检查键的值是否为零。我只想检查"用户"密钥是否存在。


Hashkey?方法告诉您给定的密钥是否存在。

1
session.key?("user")


正如Matz在这里指出的那样,虽然Hash#has_key?完成了任务,但它已经被否决了,取而代之的是Hash#key?

1
hash.key?(some_key)


在最新的Ruby版本中,哈希实例有一个key?方法:

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

请确保根据哈希中的内容使用符号键或字符串键:

1
2
{'a' => 2}.key?(:a)
=> false


很晚了,但最好用符号作为关键:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

但是在创建哈希时,如果您将字符串作为键传递,那么它将在键中搜索字符串。

但是,当创建哈希时,您将符号作为键传递,然后具有u键?将使用符号搜索键。

如果您使用的是rails,那么可以使用Hash#with_indifferent_access来避免这种情况;hash[:my_key]hash["my_key"]都指向同一个记录


您可以始终使用Hash#key?检查密钥是否存在于哈希中。

如果没有的话,它会把你送回。

1
2
3
4
5
6
7
hash =  { one: 1, two:2 }

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

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

另一条路在这里

1
2
3
4
5
6
7
hash = {one: 1, two: 2}

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

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