Простой синтаксис Scala - пытающийся определить “==” оператор - что я пропускаю?

При экспериментировании с некоторым материалом на 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.

Спасибо

8
задан Alex R 21 April 2010 в 01:42
поделиться

2 ответа

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

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

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

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

16
ответ дан 5 December 2019 в 07:11
поделиться

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

Попробуйте вместо этого:

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

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

Однако, как упомянул Кен Блум, рекомендуется переопределить равным вместо == .

7
ответ дан 5 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: