有效地比较忽略所选属性的两个Ruby对象

时间:2015-12-09 02:34:46

标签: ruby

说,我有两个Ruby对象#<Person id:1, first:"Jane", last:"Doe">#<Person id:2, first:"Jane", last:"Doe">,我想比较它们而不考虑属性id(或任何其他不需要的属性)并查看这两个对象很相似。

有兴趣学习如何使用Ruby最佳实践来有效地忽略属性并比较两个对象。

如果可能,我们将非常感谢纯Ruby对象和ActiveRecord对象的代码示例。

1 个答案:

答案 0 :(得分:1)

这可能有效:

def same(p1, p2)
  return false unless p1.class == p2.class
  p1_vars = p1.instance_variables.inject({}) { |h, var| h[var] = p1.instance_variable_get(var); h }
  p2_vars = p2.instance_variables.inject({}) { |h, var| h[var] = p2.instance_variable_get(var); h }
  p1_vars == p2_vars
end


class Person
  def initialize(fname, lname)
    @fname = fname
    @lname = lname
  end
end

p1 = Person.new('Jane', 'Doe')
p2 = Person.new('Jane', 'Doe')
p3 = Person.new('John', 'Doe')
p4 = 7

puts same(p1, p2) # true
puts same(p1, p3) # false
puts same(p1, p4) # false

您可以使用Array#rejectArray#-instance_variables中减去任何不良属性。