Переопределение метода равных в Scala

1

У меня есть следующий код. При компиляции я получаю сообщение об ошибке

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 и не могу понять, почему эта ошибка происходит (из того, что я понимаю, электронная почта является членом экземпляра игрока). Может ли кто-нибудь дать объяснение и как решить эту проблему?

Теги:
equals

2 ответа

13
Лучший ответ

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 параметров, для которых вы хотели получить доступ).

  • 0
    Или 'private val', если вы не хотите, чтобы 'email' был виден
  • 0
    Спасибо за ответ. У меня есть еще один вопрос. Мне кажется, есть еще одна опция, которая заключается в добавлении частного метода к классу, который возвращает значение параметра конструктора. Какая разница между этим и тем, что вы предложили? Один лучше другого? 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 } } }
Показать ещё 4 комментария
6

Вместо использования обычного класса и написания собственного метода equals используйте класс case, например:

case class Player(email: String)

Методы equals и hashCode генерируются автоматически для вас. Дополнительным преимуществом является то, что при изменении полей, equals/hashCode гарантированно синхронизируются. Если вы собираетесь выполнять сериализацию, большинство библиотек в любом случае ожидают классы case.

  • 0
    в этом case адрес электронной почты автоматически равен val
  • 0
    обновлено, чтобы учесть это

Ещё вопросы

Сообщество Overcoder
Наверх
Меню