Простой синтаксис Scala - пытается определить оператор "==" - что мне не хватает? - PullRequest
8 голосов
/ 21 апреля 2010

Экспериментируя с некоторыми вещами на REPL, я дошел до того, что мне нужно что-то вроде этого:

scala> class A(x:Int) { println(x); def ==(a:A) : Boolean = { this.x == a.x; } }

Просто простой класс с оператором "==".

Почему это не работает ???

Вот результат:

:10: error: type mismatch;
 found   : A
 required: ?{val x: ?}
Note that implicit conversions are not applicable because they are ambiguous:
 both method any2ArrowAssoc in object Predef of type [A](x: A)ArrowAssoc[A]
 and method any2Ensuring in object Predef of type [A](x: A)Ensuring[A]
 are possible conversion functions from A to ?{val x: ?}
       class A(x:Int) { println(x); def ==(a:A) : Boolean = { this.x == a.x; } }
                                                                        ^

Это scala 2.8 RC1.

Спасибо

Ответы [ 2 ]

15 голосов
/ 21 апреля 2010

Вы должны определить функцию equals(other:Any):Boolean, тогда Scala даст вам == бесплатно, определенную как

class Any{
  final def == (that:Any):Boolean =
    if (null eq this) {null eq that} else {this equals that}
}

См. Главу 28 («Равенство объектов») программирования в Scala для получения дополнительной информации о том, как написать функцию equals, чтобы это действительно было отношение эквивалентности.

Более того, параметр x, который вы передаете своему классу, не сохраняется как поле. Вам нужно изменить его на class A(val x:Int) ..., и тогда у него будет средство доступа, которое вы можете использовать для доступа к a.x в операторе equals.

7 голосов
/ 21 апреля 2010

Сообщение об ошибке немного сбивает с толку из-за совпадения с некоторым кодом в Predef. Но в действительности здесь происходит то, что вы пытаетесь вызвать метод x в своем классе A, но метод с таким именем не определен.

Попытка:

class A(val x: Int) { println(x); def ==(a: A): Boolean = { this.x == a.x } }

вместо этого. Этот синтаксис делает x членом A, в комплекте с обычным методом доступа.

Как уже упоминал Кен Блум, лучше переопределить equals вместо ==.

...