You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Объект Экстрактор (объект распаковщик или extractor object) - это объект с методом `unapply`. В то время как метод `apply` обычно действует как конструктор, который принимает аргументы и создает объект, метод `unapply` действует обратным образом, он принимает объект и пытается извлечь и вернуть аргументы из которых он (возможно) был создан. Чаще всего этот метод используется в функциях сопоставления с примером и в частично определенных функциях.
case _ => println("Could not extract a CustomerID")
56
+
```
57
+
58
+
{% endtab %}
59
+
60
+
{% endtabs %}
61
+
32
62
Метод `apply` создает `CustomerID` из строки `name`. `unapply` делает обратное, чтобы вернуть `name` обратно. Когда мы вызываем `CustomerID("Sukyoung")`, это сокращенный синтаксис вызова `CustomerID.apply("Sukyoung")`. Когда мы вызываем `case CustomerID(name) => println(name)`, мы на самом деле вызываем метод `unapply`.
33
63
34
64
При объявлении нового значения можно использовать пример, в котором значение для инициализации переменной получается через извлечение, используя метод `unapply`.
35
65
66
+
{% tabs extractor-objects_use-case-1 %}
67
+
68
+
{% tab 'Scala 2 и 3' for=extractor-objects_use-case-1 %}
69
+
36
70
```scala mdoc
37
71
valcustomer2ID=CustomerID("Nico")
38
72
valCustomerID(name) = customer2ID
39
73
println(name) // выведет Nico
40
74
```
41
75
76
+
{% endtab %}
77
+
78
+
{% endtabs %}
79
+
42
80
Что эквивалентно `val name = CustomerID.unapply(customer2ID).get`.
43
81
82
+
{% tabs extractor-objects_use-case-2 %}
83
+
84
+
{% tab 'Scala 2 и 3' for=extractor-objects_use-case-2 %}
85
+
44
86
```scala mdoc
45
87
valCustomerID(name2) ="--asdfasdfasdf"
46
88
```
47
89
90
+
{% endtab %}
91
+
92
+
{% endtabs %}
93
+
48
94
Если совпадений нет, то бросается `scala.MatchError`:
49
95
96
+
{% tabs extractor-objects_use-case-3 %}
97
+
98
+
{% tab 'Scala 2 и 3' for=extractor-objects_use-case-3 %}
99
+
50
100
```scala mdoc:crash
51
101
valCustomerID(name3) ="-asdfasdfasdf"
52
102
```
53
103
104
+
{% endtab %}
105
+
106
+
{% endtabs %}
107
+
54
108
Возвращаемый тип `unapply` выбирается следующим образом:
55
109
56
-
* Если это всего лишь тест, возвращается `Boolean`. Например `case even()`.
57
-
* Если в результате найдено одно значение типа `T`, то возвращается `Option[T]`.
58
-
* Если вы хотите получить несколько значений `T1,..., Tn`, то ответ необходимо группировать в дополнительный кортеж `Option[(T1,..., Tn)]`.
110
+
- Если это всего лишь тест, возвращается `Boolean`. Например `case even()`.
111
+
- Если в результате найдено одно значение типа `T`, то возвращается `Option[T]`.
112
+
- Если вы хотите получить несколько значений `T1,..., Tn`, то ответ необходимо группировать в дополнительный кортеж `Option[(T1,..., Tn)]`.
59
113
60
-
Иногда количество извлекаемых значений не является фиксированным. Если в зависимости от входа мы хотим вернуть произвольное количество значений, то для этого случая мы можем определить экстрактор методом `unapplySeq`, который возвращает `Option[Seq[T]]`. Характерным примером такого подхода является разложение `List` с помощью `case List(x, y, z) =>`и разложение `String` с помощью регулярного выражения `Regex`, такого как `case r(name, remainingFields @ _*) =>`.
114
+
Иногда количество извлекаемых значений не является фиксированным. Если в зависимости от входа мы хотим вернуть произвольное количество значений, то для этого случая мы можем определить экстрактор методом `unapplySeq`, который возвращает `Option[Seq[T]]`. Характерным примером такого подхода является разложение `List` с помощью `case List(x, y, z) =>` и разложение `String` с помощью регулярного выражения `Regex`, такого как `case r(name, remainingFields @ _*) =>`.
0 commit comments