2011-08-18 20 views
5

Tôi muốn kiểm tra xem một băm có khóa có chứa một số văn bản hay không. Nó có thể không phải là khóa chính xác, nhưng khóa phải chứa (như .include?) văn bản. Giải pháp của tôi cho việc này là:Kiểm tra xem băm có khóa có chứa một số văn bản

some_hash.select {|k,v| k.include? "foo"}.empty? 

Nhưng điều này sẽ tạo thêm một băm nữa. Tôi chỉ muốn kiểm tra sự tồn tại của chìa khóa. Có cách nào tốt hơn để làm điều đó không?

Trả lời

10

Đây sẽ là một chút đẹp hơn:

some_hash.any? {|k, v| k.include? "foo"} 

("? Không băm có bất kỳ phím bao gồm 'foo'" Với tôi đây đọc như )

Ngoài ra, điều này có thể kém hiệu quả hơn, nhưng thực sự hiệu quả hơn một chút (xem nhận xét) và có thể dễ đọc hơn một chút:

some_hash.keys.any? {|k| k.include? "foo"} 
+0

Tuyệt vời! Cảm ơn! –

+1

Phần giữa của bạn không hoạt động, vì nó gán một mảng khóa/giá trị cho "khóa", và sau đó bạn nhận được Array.include ?, không phải String.include ?, không thực hiện so khớp từng phần. Kiểm tra thời gian nhanh cho thấy cách cuối cùng của bạn, điều tôi đồng ý dễ đọc hơn, cũng nhanh hơn một chút so với cách đầu tiên của bạn. –

+0

@glenn mcdonald: Ah! Rằng nó sẽ là một mảng k/v là bản năng đầu tiên của tôi, nhưng do một tai nạn hạnh phúc trường hợp thử nghiệm của tôi đã làm việc :) Đã chỉnh sửa, cảm ơn/+ 1! – jtbandes

0

some_hash.any? {|k,v| k.include? "foo"}

5
some_hash.keys.any? {|k| k.include? 'foo' } 
Các vấn đề liên quan