阿男的小窝

View the Project on GitHub

使用Ruby的Code Block创建一个Hash比较函数

在使用Ruby开发时,经常会遇到需要比较两个Hash对象的值的场合。代码类似如下:

x = Hash.new
x[:a] = 'x'
y = Hash.new
y[:a] = 'y'

x.keys.each do |key|
  if x[key] != y[key]
    puts "find difference for key #{key}: x = #{x[key]}, y = #{y[key]}"
  end
end

这样写代码固然可以,但是代码显得有些零乱,另外这种比较逻辑经常需要复用,能不能把它封装在一个函数当中呢?答案是肯定的,使用Ruby提供的yield便可以实现:

def diff(hash_a, hash_b)
  hash_a.keys.each do |key|
    if hash_a[key] != hash_b[key]
      yield key
    end
  end
end

使用上面的函数就可以进行Hash的比较了,代码也干净许多,最重要的是逻辑可以复用:

x = Hash.new
x[:a] = 'foo'
x[:b] = 'same'

y = Hash.new
y[:a] = 'bar'
y[:b] = 'same'

puts "-= R E S U L T =-"
diff(x, y) do |key|
  puts "#{key} -> x: #{x[key]} / y: #{y[key]}"
end

上面的代码执行结果如下:

$ ruby foo.rb
-= R E S U L T =-
a -> x: foo / y: bar

以上就是yield的一个应用场景。