在Ruby中访问同一类的其他对象的成员变量

时间:2009-09-18 10:04:36

标签: java ruby equals

在Java中,我可以这样做:

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

这允许我在不破坏类的封装的情况下定义相等性。 我怎样才能在Ruby中做同样的事情?

感谢。

3 个答案:

答案 0 :(得分:4)

在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

答案 1 :(得分:0)

正如其他人所指出的,您需要在课堂上重新定义#==。但有一个问题是哈希表。如果您希望类的两个不同实例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

答案 2 :(得分:-1)

只需进行比较而不使用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?更改为==