Question

En Java, je peux faire:

public boolean equals(Object other) {
    return this.aPrivateVariable == ((MyClass)other).aPrivateVariable;
}

Cela me permet de définir l’égalité sans rompre l’encapsulation de ma classe. Comment puis-je faire la même chose en Ruby?

Merci.

Était-ce utile?

La solution

Dans Ruby, les variables d’instance et les méthodes privées ne sont accessibles que par l’objet lui-même, et non par un autre objet, quelle que soit sa classe. Les méthodes protégées sont disponibles pour l'objet lui-même et d'autres objets de la même classe.

Donc, pour faire ce que vous voulez, vous pouvez définir une méthode getter protégée pour votre variable.

Modifier: un exemple:

class Foo
  protected
  attr_accessor :my_variable # Allows other objects of same class
                             # to get and set the variable. If you
                             # only want to allow getting, change
                             # "accessor" to "reader"

  public
  def ==(other)
    self.my_variable == other.my_variable
  end
end

Autres conseils

Comme d'autres l'ont fait remarquer, vous devez redéfinir # == dans votre classe. Un des pièges, cependant, sont les tables de hachage. Si vous voulez deux instances différentes de votre classe avec o1 == o2 # = > true pour hacher la même valeur dans une table de hachage, vous devez alors redéfinir #hash et #eql? pour que la table de hachage sache qu'ils représentent le même valeur.

class Foo
  def initialize(x,y,z)
    @x,@y,@z = x,y,z
  end
  def ==(other)
    @y == other.instance_eval { @y }
  end
end

o1 = Foo.new(0, :frog, 2)
o2 = Foo.new(1, :frog, 3)

o1 == o2 #=> true

h1 = Hash.new
h1[o1] = :jump
h1[o2] #=> nil

class Foo
  def hash
    @y.hash
  end
  def eql?(other)
    self == other
  end
end

h2 = Hash.new
h2[o1] = :jump_again
h2[o2] #=> :jump_again

Faites simplement la comparaison sans la distribution, ce qui n'est pas nécessaire en Ruby.

class C1
  attr_accessor :property

  def == other
    property == other.property
  end
end

class C2
  attr_accessor :property

  def == other
    property == other.property
  end
end

c1 = C1.new
c1.property = :foo

c2 = C2.new
c2.property = :bar

p c1 == c2 # => false

c1.property = :bar
p c1 == c2 # => true

Modifier : remplacé? est remplacé par == .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top