случай совпадения scala с использованием :: для списков - PullRequest
7 голосов
/ 29 декабря 2011

При условии совпадения этого шаблона:

List(1,2,3) match {
  case head :: tail => println(">>> head=" + head)
}

Я предполагаю, что '::' - это класс case, найденный в scala.collection.immutable, но как разрешить запись '::' в эту форму (инфиксная запись)? - есть ли конкретное правило, позволяющее это сделать?

Спасибо

Ответы [ 2 ]

25 голосов
/ 29 декабря 2011

Можно даже написать:

val head :: tail = List(1, 2, 3)

По существу, все, где ожидается шаблон (присваивание, оператор match или строка для понимания), может принимать экстрактор , который определяется как сущность с методом unapply.

Один из кусочков синтаксического сахара , который вам предоставляет скала, - это; если у вас есть экстрактор X(a, b), это можно записать как a X b. Вот пример с классами case (которые имеют экстрактор по умолчанию):

scala> case class X(a: Int, b: String)
defined class X

scala> val a X b = X(1, "two")
a: Int = 1
b: String = two

Возможность записи таких сущностей infix распространяется и на типы:

scala> type MappedTo[A, B] = Map[A, B]
defined type alias MappedTo

scala> def foo(m: Int MappedTo String) = m foreach println
foo: (m: MappedTo[Int,String])Unit

Обратите внимание, что ни в одном случае scala не ограничивает такие инфиксные операторы символическими идентификаторами

3 голосов
/ 29 декабря 2011

Scala на самом деле имеет неизменный класс ::, который представляет непустой список (дополнение к Nil). Существует инфиксная запись для классов (которая также работает как A <:< B), которая позволяет вам писать head :: tail вместо ::(head, tail). Поскольку :: является классом case, он имеет значение по умолчанию unapply, которое заставляет case работать, как вы иллюстрируете.

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