说,我有两个Ruby对象#<Person id:1, first:"Jane", last:"Doe">
和#<Person id:2, first:"Jane", last:"Doe">
,我想比较它们而不考虑属性id
(或任何其他不需要的属性)并查看这两个对象很相似。
有兴趣学习如何使用Ruby最佳实践来有效地忽略属性并比较两个对象。
如果可能,我们将非常感谢纯Ruby对象和ActiveRecord对象的代码示例。
答案 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#reject
或Array#-
从instance_variables
中减去任何不良属性。