【问题标题】:ruby Hash include another hash, deep checkruby 哈希包含另一个哈希,深度检查
【发布时间】:2011-04-19 02:59:10
【问题描述】:

进行这种深入检查的最佳方法是什么:

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

谢谢

【问题讨论】:

  • 目前还不清楚您真正希望这段代码做什么。您是否要检查散列值是否为包含值 2 的 key :c 和值为 3 的 key :f 的散列值?您是否要检查 key b: 的哈希值是否是包含 key :c 值为 2 和 key :f 值为 3 的哈希值?或者您是否要检查键 b: 的哈希值是否是 _exactly 哈希键 :c 的值为 2 和键 :f 的值为 3?请准确解释您想要什么 - 最好有一些返回 true 的示例,以及一些返回 false 的示例。

标签: ruby hash include


【解决方案1】:

我想我从那个例子中明白了你的意思(不知何故)。我们检查 subhash 中的每个 key 是否在 superhash 中,然后检查这些 key 的对应值是否以某种方式匹配:如果值是 hash,则执行另一个深度检查,否则,检查值是否相等:

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

您可以看到它是如何工作的,因为 if 语句返回一个值:最后一个语句被评估(我没有使用三元条件运算符,因为这会使它变得更丑陋且更难阅读)。

【讨论】:

    【解决方案2】:

    我喜欢这个:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 2017-04-28
      • 2013-07-21
      • 2017-04-13
      • 1970-01-01
      相关资源
      最近更新 更多