Làm thế nào để kiểm tra xem một khóa cụ thể có trong hàm băm hay không?


636

Tôi muốn kiểm tra xem khóa "người dùng" có hay không trong hàm băm. Tôi có thể làm cái này như thế nào?

Lưu ý rằng tôi không muốn kiểm tra xem giá trị của khóa có bằng không hay không. Tôi chỉ muốn kiểm tra xem "người sử dụng" chính là hiện tại.

Câu trả lời:


952

Hashkey?Phương thức của nó cho bạn biết liệu một khóa đã cho có hay không.

session.key?("user")

hay: Trình truy cập "chuỗi" cũng hoạt động cho các đối tượng được phân tích cú pháp JSON.parse :)
Bijan

2
Điều này không hiệu quả với tôi, phương pháp: người dùng đã hoạt động thay thế
Akash Agarwal

295

Trong khi Hash#has_key?hoàn thành công việc, như Matz lưu ý ở đây , nó đã bị từ chối ủng hộ Hash#key?.

hash.key?(some_key)

1
Tham khảo tốt đẹp về yêu cầu thay đổi đó và phản hồi tiếp theo từ Matz.
Joshua Pinter

Có ai biết chắc chắn không?
tiền mã hóa

41

Trong các phiên bản Ruby mới nhất, ví dụ Hash có một key?phương thức:

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

Hãy chắc chắn sử dụng khóa ký hiệu hoặc khóa chuỗi tùy thuộc vào những gì bạn có trong hàm băm của mình:

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

2
Xuất hiện sớm nhất là Ruby 1.6: ruby-doc.com/docs/ProgrammingRuby/html/ (có lẽ trước đó, dunno nơi kiểm tra tài liệu)
Beni Cherniavsky-Paskin

28

Nó rất muộn nhưng tốt nhất nên sử dụng các ký hiệu làm khóa:

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 

Nhưng khi tạo hàm băm nếu bạn truyền chuỗi dưới dạng khóa thì nó sẽ tìm kiếm chuỗi trong khóa.

Nhưng khi tạo hàm băm bạn truyền biểu tượng làm khóa rồi has_key? sẽ tìm kiếm các phím bằng cách sử dụng biểu tượng.


Nếu bạn đang sử dụng Rails, bạn có thể sử dụng Hash#with_indifferent_accessđể tránh điều này; cả hai hash[:my_key]hash["my_key"]sẽ chỉ đến cùng một hồ sơ


6
Nếu bạn đang sử dụng Rails, bạn có thể sử dụng Hash#with_indifferent_accessđể tránh điều này; cả hai :my_key"my_key"sẽ chỉ đến cùng một kỷ lục
Devon Parsons

5

Bạn luôn có thể sử dụng Hash#key?để kiểm tra xem khóa có trong hàm băm hay không.

Nếu không nó sẽ trả lại cho bạn false

hash =  { one: 1, two:2 }

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

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

3

Một cách khác là ở đây

hash = {one: 1, two: 2}

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

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

0

Trong Rails 5, has_key? phương thức kiểm tra nếu khóa tồn tại trong hàm băm. Cú pháp sử dụng nó là:

YourHash.has_key? :yourkey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.