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.
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:
Hash
key?
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")
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)
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
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]
và hash["my_key"]
sẽ chỉ đến cùng một hồ sơ
Hash#with_indifferent_access
để tránh điều này; cả hai :my_key
và "my_key"
sẽ chỉ đến cùng một kỷ lục
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
Một cách khác là ở đây
hash = {one: 1, two: 2}
hash.member?(:one)
#=> true
hash.member?(:five)
#=> false