Frage

In Java kann ich:

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

Dies ermöglicht es mir, Gleichheit zu definieren, ohne die Verkapselung meiner Klasse zu brechen. Wie kann ich das gleiche in Ruby machen?

Vielen Dank.

War es hilfreich?

Lösung

In Ruby Instance sind sowohl Variablen als auch private Methoden nur für das Objekt selbst zugänglich, nicht für ein anderes Objekt unabhängig von ihrer Klasse. Geschützte Methoden stehen dem Objekt selbst und anderen Objekten derselben Klasse zur Verfügung.

Um das zu tun, was Sie wollen, können Sie eine geschützte Getter-Methode für Ihre Variable definieren.

Bearbeiten: Ein Beispiel:

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

Andere Tipps

Wie andere betont haben, müssen Sie neu definieren #== in deiner Klasse. Ein Gotcha ist jedoch Hash -Tische. Wenn Sie zwei verschiedene Instanzen Ihrer Klasse mit wollen o1 == o2 #=> true Hash in einer Hash -Tabelle zum gleichen Wert, dann müssen Sie neu definieren #hash und #eql? Die Hash -Tabelle weiß also, dass sie den gleichen Wert darstellen.

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

Führen Sie einfach den Vergleich ohne die Besetzung durch, die in Ruby nicht notwendig ist.

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

Bearbeiten: Geändert equals? zu ==.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top