При экспериментировании с некоторым материалом на 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.
Спасибо
Вы должны определить функцию 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
оператор.
Сообщение об ошибке немного сбивает с толку из-за совпадения с некоторым кодом в Predef. Но на самом деле здесь происходит то, что вы пытаетесь вызвать метод x
в своем классе A
, но метод с таким именем не определен.
Попробуйте вместо этого:
class A(val x: Int) { println(x); def ==(a: A): Boolean = { this.x == a.x } }
. Этот синтаксис делает x
членом A
вместе с обычным методом доступа.
Однако, как упомянул Кен Блум, рекомендуется переопределить равным
вместо ==
.