У меня есть следующий код. При компиляции я получаю сообщение об ошибке
value email is not a member of Player
class Player(email: String)
{
override def equals(player: Any): Boolean = {
player match {
case p: Player => email.equals(p.email)
case _ => false
}
}
}
Я программист Java, пробовал Scala и не могу понять, почему эта ошибка происходит (из того, что я понимаю, электронная почта является членом экземпляра игрока). Может ли кто-нибудь дать объяснение и как решить эту проблему?
email
- это только параметр конструктора, а не член самого класса. Вы можете сделать это как таковое, предваряя его val
class Player(val email: String) {
override def equals(player: Any): Boolean = {
player match {
case p: Player => email.equals(p.email)
case _ => false
}
}
}
Для полноты вы также можете вручную email
по email
члену Player
:
class Player(e: String) {
val email: String = e
...
}
Или def (если вы по какой-то причине хотите):
class Player(e: String) {
def email: String = e
...
}
Как упоминалось в @srgfed01, вы также можете включить модификаторы доступа в конструктор. Например:
class Player(private val email: String)
Класс case автоматически генерирует геттеры для вашего класса, хотя по умолчанию они являются общедоступными.
Я предпочитаю первый метод объявления параметра конструктора членом класса, поскольку он ясен, краток и уменьшает беспорядок кода (представьте, если у вас было 10 параметров, для которых вы хотели получить доступ).
class Player(p_email: String) { private def email:String = p_email override def equals(player: Any): Boolean = { player match { case p: Player => email.equals(p.email) case _ => false } } }
Вместо использования обычного класса и написания собственного метода equals используйте класс case, например:
case class Player(email: String)
Методы equals и hashCode генерируются автоматически для вас. Дополнительным преимуществом является то, что при изменении полей, equals/hashCode гарантированно синхронизируются. Если вы собираетесь выполнять сериализацию, большинство библиотек в любом случае ожидают классы case.
case
адрес электронной почты автоматически равен val