Доступ к переменным-членам другого объекта того же класса в Ruby

StackOverflow https://stackoverflow.com/questions/1443600

  •  22-07-2019
  •  | 
  •  

Вопрос

В Java я могу сделать:

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

Это позволяет мне определить равенство, не нарушая инкапсуляцию моего класса.Как я могу сделать то же самое в Ruby?

Спасибо.

Это было полезно?

Решение

В Ruby переменные экземпляра, а также частные методы доступны только самому объекту, а не любому другому объекту, независимо от его класса.Защищенные методы доступны самому объекту и другим объектам того же класса.

Итак, чтобы делать то, что вы хотите, вы можете определить защищенный метод получения для вашей переменной.

Редактировать:Пример:

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? к ==.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top