比较红宝石中的物体

时间:2010-10-15 09:41:53

标签: ruby object compare

考虑一下:

class Aaa
  attr_accessor :a, :b
end

x = Aaa.new
x.a, x.b = 1,2
y = Aaa.new
y.a, y.b = 1,2

puts x == y #=>false

有没有办法检查所有公共属性在相同类型的类中是否相等?

4 个答案:

答案 0 :(得分:8)

Aaa = Struct.new(:a, :b)

x = Aaa.new
x.a, x.b = 1,2
y = Aaa.new
y.a, y.b = 1,2

x == y #=> true

Struct为您定义==eql?hash,以便两个Aaa相等,如果它们的值为a }和b是平等的。它还定义了initialize,以便您在创建对象(a)时可以选择传递bAaa.new(value_for_a, value_for_b)的值。它定义to_a以返回[a,b]

您还可以将Struct.new与块一起使用来定义其他方法,这样您就拥有了“普通”类的全部功能:

Aaa = Struct.new(:a, :b) do
  def c
    a+b
  end
end
Aaa.new(23,42).c #=> 65

答案 1 :(得分:7)

class Aaa
  attr_accessor :a, :b

  def ==(other)
    return self.a == other.a && self.b == other.b
  end
end

x = Aaa.new
x.a,x.b = 1,2
y = Aaa.new
y.a,y.b = 1,2
y = Aaa.new
y.a,y.b = 1,2
z = Aaa.new
z.a,z.b = 1,3

x == y # => true
x == z # => false

答案 2 :(得分:1)

我们可以很容易地推广到任意数量的实例,并删除实例变量的getter要求:

class Aaa
  def initialize(a,b,c)
    @a, @b, @c = a, b, c
  end
end

x = Aaa.new(1,2,3)
y = Aaa.new(1,2,3)
z = Aaa.new(1,2,3)
arr = [x,y,z]

x.instance_variables.map do |v|
  arr.map { |i| i.send(:instance_variable_get,v) }.uniq.size == 1
end.all?
  #=>true

z更改为:

z = Aaa.new(1,2,4)

然后:

x.instance_variables.map do |v|
  arr.map { |i| i.send(:instance_variable_get,v) }.uniq.size == 1
end.all?
  #=> false

答案 3 :(得分:0)

相关问题