Zugriff auf Mitgliedsvariablen eines anderen Objekts derselben Klasse in Ruby
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.
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 ==
.