Reputation: 5329
Say we have "deep hashes" like:
b = {1 => {2 => {} }, 4 => {} }
a = {1 => {2 => {3 => {} }}, 4 => {}, 5 => "123" }
or
b = {1 => {children: {2 => {children: false} }}}
a = {1 => {name: "name", surname:"sur", children: {2 => {name: "name", surname:"sur", children: false}}}, 3 => {}}
a
includes b
but not versa vice;
Here's my try:
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
Short version:
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
My question: is there more graceful way to do that?
Upvotes: 1
Views: 169
Reputation: 67880
Functional approach:
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
Upvotes: 1