Вопросы относительно сопоставления регистра в выписке scala. - PullRequest
0 голосов
/ 10 февраля 2020

Можете ли вы объяснить второй случай в этой функции, которая обнаруживает палиндромы.

def isListPanlindrome(list: List[Int]): Boolean = list match {
  case Nil => true
  case List(a) => true
  case list => (list.head == list.last && isListPanlindrome(list.tail.init))
}

Специфика c Вопросы, которые я задаю:

  1. Что такое a здесь, он даже нигде не определен.
  2. Как сопоставление регистра работает с экземпляром объекта List.
  3. Почему он может сопоставлять список с одним элементом?

1 Ответ

4 голосов
/ 10 февраля 2020
  1. Что такое здесь, оно даже нигде не определено.

Это точно определено прямо здесь.
case List(a) => true означает: соответствует Перечислите только одного элемента и назовите этот элемент a. Так как он нигде не используется, вы можете просто сделать case List(_) => true.
Однако, ИМХО, было бы более идиоматическим c (и, возможно, даже более производительным) для выполнения case _ :: Nil => true

Как сопоставление регистра работает с экземпляром объекта List. Почему он может сопоставить список с одним элементом

Это в основном вызов метод unapply в объекте-компаньоне List. Это называется объекты экстрактора .
(я полагаю, что связанная статья дает отличное объяснение того, как это работает, поэтому я не буду go дальше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...