Consider this:
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
Is there some way to check if all public attributes are equal in classes of same type?
method. This method tests object equality by checking if the 2 objects refer to the same hash key. Here, the instances assigned to the key and other_key variables are 2 distinct instances. Now, if the Hash#[]= method made the comparison at an object-level then it'd rather create an entry for each string.
The == operator compares whether two object references point to the same object.
The equals() method of the Object class compare the equality of two objects. The two objects will be equal if they share the same memory address. Syntax: public boolean equals(Object obj)
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
                        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 defines ==, eql?, and hash for you, so that two Aaas are equal, if their values for a and b are equal. It also defines initialize so that you can optionally pass in the values for a and b when creating the object (Aaa.new(value_for_a, value_for_b)). And it defines to_a to return [a,b].
You can also use Struct.new with a block to define additional methods, so you have the full power of a "normal" class:
Aaa = Struct.new(:a, :b) do
  def c
    a+b
  end
end
Aaa.new(23,42).c #=> 65
                        We can easily generalize to any number of instances and drop the requirement for getters for the instance variables:
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
Change z to:
z = Aaa.new(1,2,4)
then:
x.instance_variables.map do |v|
  arr.map { |i| i.send(:instance_variable_get,v) }.uniq.size == 1
end.all?
  #=> false
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With