比较红宝石中的物体

dfe*_*ens 6 ruby compare object

考虑一下:

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
Run Code Online (Sandbox Code Playgroud)

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

sep*_*p2k 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
Run Code Online (Sandbox Code Playgroud)

Struct定义==,eql?hash你,这样两个Aaas为相等的,如果他们的价值观ab是相等的.它还定义initialize为您可以选择传入值a以及b创建对象时(Aaa.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
Run Code Online (Sandbox Code Playgroud)


Jas*_*ble 8

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
Run Code Online (Sandbox Code Playgroud)

  • 在你的==(其他)方法中,你可以做self.instance_variables.each做| ivar | self.ivar == other.ivar end你可能也想看看===. (4认同)