2012-07-04 128 views
1

說我們有 「深哈希值」,如:無論一個哈希包括其他哈希

b = {1 => {2 => {} }, 4 => {} } 
a = {1 => {2 => {3 => {} }}, 4 => {}, 5 => "123" } 

b = {1 => {children: {2 => {children: false} }}} 
a = {1 => {name: "name", surname:"sur", children: {2 => {name: "name", surname:"sur", children: false}}}, 3 => {}} 

a包括b但不是副反之亦然;

這裏是我的嘗試:

class Hash 

    def >=(b) 
    eq ||= true  
    b.each do |k, v| 
     if !(self.include? k) 
     eq = false 
     elsif (((self[k]&&v).is_a? Hash) && !((v||self[k]).empty?)) 
     self[k]>=v 
     end 
    end 

    return eq 
    end 
end 

a >= b # true 
b >= a # false 

短版:

class Hash 

    def >=(b) 
    eq = true 
    b.each { |k, v| eq &= !(self.include? k) ? false : ((((self[k]&&v).is_a? Hash) && !((v||self[k]).empty?)) ? self[k]>=v : true)} 

    return eq 
    end 
end 

我的問題:是否有更優雅的方式來做到這一點?

回答

1

功能的方法:

class Hash 
    def >=(other) 
    other.all? do |key, value| 
     if self.has_key?(key) 
     value.is_a?(Hash) ? (self[key].is_a?(Hash) && self[key] >= value) : (self[key] == value) 
     else 
     false 
     end 
    end 
    end 
end 
+0

看起來你退出了競爭(作者: – ted

+0

@ted:如此看來,這是一個有趣的問題,但需要注意的是,你還可以與之前的狀態做到這一點。 'all?',在做任何事情之前檢查你是否擁有所有的密鑰:'if(other.keys - self.keys).empty?... all?這裏沒有if.has_key或其他的東西... else FALSE' – tokland