Создание объектов по обе стороны от оператора присваивания в Scala;как это работает - PullRequest
4 голосов
/ 17 апреля 2019

Я хочу понять механизм за следующей строкой:

 val List(x) = Seq(1 to 10)

Как называется этот механизм?Это то же самое, что приведение типов или что-то еще происходит?(Проверено в Scala 2.11.12.)

Ответы [ 4 ]

7 голосов
/ 17 апреля 2019

Механизм называется Pattern Matching .

Вот официальная документация: https://docs.scala -lang.org / tour / pattern-match.html

Это работает также для понимания:

for{
 People(name, firstName) <- peoples
} yield s"$firstName $name"

К вашему примеру:

val List(x) = Seq(1 to 10)

x - это содержимое этого списка - в вашем случае Range 1 to 10 (у вас есть список с одним элементом).

Если у вас действительно список с более чем одним элементом, это приведет к исключению

val List(x) = (1 to 10).toList // -> ERROR: undefined

Таким образом, правильное сопоставление с образцом будет:

val x::xs = (1 to 10).toList

Теперь x - это первый элемент (голова), а xs - остальные (хвост).

6 голосов
/ 17 апреля 2019

Я подозреваю, что ваша проблема на самом деле является выражением

Seq(1 to 10)

Это создает не последовательность из 10 элементов, а последовательность, содержащую один Range объект.Поэтому, когда вы делаете это,

val List(x) = Seq(1 to 10)

x назначается этому Range объекту.

Если вы хотите List чисел, сделайте следующее:

(1 to 10).toList

Шаблон List(x) будет соответствовать только в том случае, если выражение справа является экземпляром List, содержащим один элемент.Он не будет соответствовать пустому List или List с более чем одним элементом.

В этом случае это работает, потому что конструктор для Seq фактически возвращает экземпляр List.

5 голосов
/ 17 апреля 2019

Эта техника называется деструктуризацией объекта. Haskell предоставляет аналогичную функцию. Для этого Scala использует сопоставление с образцом.

В этом случае используется метод Seq # unapplySeq: https://www.scala -lang.org / апи / ток / Скала / Коллекция / Seq.html

3 голосов
/ 17 апреля 2019

Вы можете думать о

val <pattern> = <value>
<next lines>

в

<value> match {
  case <pattern> => 
    <next lines>
}

Это происходит не только тогда, когда <pattern> является просто переменной или переменной с типом.

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