Как сделать pattern-match вложенного класса в Scala?

Я попробовал код ниже (метод equal написан после книги Программирование на Scala)

class Person() {
    class Room(r: Int, c: Int) {
        val row = r
        val col = c

        override def hashCode: Int =
            41 * (
                41 + row.hashCode
            ) + col.hashCode

        override def equals(other: Any) =
            other match {
                case that: Room =>
                   (that canEqual this) &&
                   this.row == that.row &&
                   this.col == that.col
               case _ => false
            }

        def canEqual(other: Any) =
            other.isInstanceOf[Room]
    }

    val room = new Room(2,1)
}

val p1 = new Person()
val p2 = new Person()

println(p1.room == p2.room)
>>> false

После некоторого анализа я обнаружил, что Scala переопределяет класс Room для каждого экземпляра Person, и это причина, по которой две комнаты не равны.

Один из вариантов решения проблемы - поместить класс вне класса Person, но это не всегда проще всего. (Например, если класс должен получить доступ к некоторым параметрам Person.)

Какие есть альтернативы написанию метода equal?

9
задан Georg Schölly 2 December 2011 в 13:58
поделиться