【问题标题】:Whether one hash includes another hash一个哈希是否包含另一个哈希
【发布时间】:2012-07-05 01:06:39
【问题描述】:

假设我们有“深度哈希”,例如:

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

我的问题:有没有更优雅的方式来做到这一点?

【问题讨论】:

    标签: ruby


    【解决方案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
    

    【讨论】:

    • 看起来你退出了竞争(:
    • @ted:看来,这是一个有趣的问题。请注意,您也可以使用all? 之前的条件来执行此操作,在执行任何操作之前检查您是否拥有所有密钥:if (other.keys - self.keys).empty? ...all? stuff here without the if.has_key nor the else... else false
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2011-04-19
    • 1970-01-01
    • 2013-11-23
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多