在 Java 中,我可以这样做:
public boolean equals(Object other) {
return this.aPrivateVariable == ((MyClass)other).aPrivateVariable;
}
这使我可以在不破坏类封装的情况下定义平等。我怎样才能在 Ruby 中做同样的事情?
谢谢。
在 ruby 中,实例变量和私有方法只能被对象本身访问,而不能被任何其他对象访问,无论它们的类如何。受保护的方法可用于对象本身和同一类的其他对象。
所以要做你想做的事,你可以为你的变量定义一个受保护的 getter 方法。
编辑:一个例子:
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
正如其他人指出的那样,您需要#==
在课堂上重新定义。不过,其中一个问题是哈希表。如果您希望您的类的两个不同实例o1 == o2 #=> true
在哈希表中哈希到相同的值,那么您需要重新定义#hash
,#eql?
以便哈希表知道它们代表相同的值。
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
只需在没有 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
编辑:更改equals?
为==
.