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

私の質問:それを行うためのより優雅な方法はありますか?

4

1 に答える 1

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
于 2012-07-04T17:06:39.300 に答える