2010-09-30 28 views
6

cách tốt nhất để thực hiện kiểm tra sâu như vậy là gì:ruby ​​Hash bao gồm một băm, sâu kiểm tra

{:a => 1, :b => {:c => 2, :f => 3, :d => 4}}.include?({:b => {:c => 2, :f => 3}}) #=> true 

nhờ

+4

Đó là chưa rõ ràng những gì bạn thực sự muốn mã này để làm. Bạn có muốn kiểm tra xem giá trị băm có giá trị là băm bao gồm khóa: c với giá trị 2 và khóa: f có giá trị 3 không? Bạn có muốn kiểm tra giá trị băm cho khóa b: là băm bao gồm khóa: c với giá trị 2 và khóa: f có giá trị 3 không? Hoặc bạn có muốn kiểm tra giá trị băm cho khóa b: là _exactly khóa băm: c với giá trị 2 và khóa: f có giá trị 3 không? Vui lòng giải thích chính xác những gì bạn muốn - tốt nhất là với một số ví dụ đã trả về đúng sự thật và một số ví dụ sẽ trả về sai. – SamStephens

Trả lời

5

Tôi nghĩ tôi xem những gì bạn có nghĩa là từ đó là một ví dụ (bằng cách nào đó). Chúng tôi kiểm tra xem mỗi khóa trong subhash có trong superhash hay không và sau đó kiểm tra xem các giá trị tương ứng của các khóa này có khớp với nhau hay không: nếu giá trị là băm, hãy thực hiện một kiểm tra sâu khác, nếu không, hãy kiểm tra xem các giá trị có bằng nhau hay không:

class Hash 
    def deep_include?(sub_hash) 
    sub_hash.keys.all? do |key| 
     self.has_key?(key) && if sub_hash[key].is_a?(Hash) 
     self[key].is_a?(Hash) && self[key].deep_include?(sub_hash[key]) 
     else 
     self[key] == sub_hash[key] 
     end 
    end 
    end 
end 

Bạn có thể thấy cách làm việc này vì báo cáo kết quả if trả về một giá trị: báo cáo kết quả cuối cùng đánh giá (tôi không sử dụng các nhà điều hành có điều kiện ternary vì đó sẽ làm cho điều này xa xấu xí và khó khăn hơn để đọc).

+0

vâng, cảm ơn! ... –

0

Tôi thích cái này:

class Hash 
    def include_hash?(other) 
    other.all? do |other_key_value| 
     any? { |own_key_value| own_key_value == other_key_value } 
    end 
    end 
end 
Các vấn đề liên quan