How do I compare two hashes?

前端 未结 14 1527
粉色の甜心
粉色の甜心 2020-11-30 00:06

I am trying to compare two Ruby Hashes using the following code:

#!/usr/bin/env ruby

require \"yaml\"
require \"active_support\"

file1 = YAML::load(File.op         


        
14条回答
  •  暖寄归人
    2020-11-30 00:50

    You can compare hashes directly for equality:

    hash1 = {'a' => 1, 'b' => 2}
    hash2 = {'a' => 1, 'b' => 2}
    hash3 = {'a' => 1, 'b' => 2, 'c' => 3}
    
    hash1 == hash2 # => true
    hash1 == hash3 # => false
    
    hash1.to_a == hash2.to_a # => true
    hash1.to_a == hash3.to_a # => false
    


    You can convert the hashes to arrays, then get their difference:

    hash3.to_a - hash1.to_a # => [["c", 3]]
    
    if (hash3.size > hash1.size)
      difference = hash3.to_a - hash1.to_a
    else
      difference = hash1.to_a - hash3.to_a
    end
    Hash[*difference.flatten] # => {"c"=>3}
    

    Simplifying further:

    Assigning difference via a ternary structure:

      difference = (hash3.size > hash1.size) \
                    ? hash3.to_a - hash1.to_a \
                    : hash1.to_a - hash3.to_a
    => [["c", 3]]
      Hash[*difference.flatten] 
    => {"c"=>3}
    

    Doing it all in one operation and getting rid of the difference variable:

      Hash[*(
      (hash3.size > hash1.size)    \
          ? hash3.to_a - hash1.to_a \
          : hash1.to_a - hash3.to_a
      ).flatten] 
    => {"c"=>3}
    

提交回复
热议问题