Skip to content

Commit dce2920

Browse files
artemkorsakovjulienrf
authored andcommitted
Update extractor-objects.md in russian
1 parent 8af7d54 commit dce2920

File tree

1 file changed

+58
-4
lines changed

1 file changed

+58
-4
lines changed

_ru/tour/extractor-objects.md

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ previous-page: regular-expression-patterns
1010

1111
Объект Экстрактор (объект распаковщик или extractor object) - это объект с методом `unapply`. В то время как метод `apply` обычно действует как конструктор, который принимает аргументы и создает объект, метод `unapply` действует обратным образом, он принимает объект и пытается извлечь и вернуть аргументы из которых он (возможно) был создан. Чаще всего этот метод используется в функциях сопоставления с примером и в частично определенных функциях.
1212

13+
{% tabs extractor-objects_definition class=tabs-scala-version %}
14+
15+
{% tab 'Scala 2' for=extractor-objects_definition %}
16+
1317
```scala mdoc
1418
import scala.util.Random
1519

@@ -29,32 +33,82 @@ customer1ID match {
2933
case _ => println("Could not extract a CustomerID")
3034
}
3135
```
36+
37+
{% endtab %}
38+
39+
{% tab 'Scala 3' for=extractor-objects_definition %}
40+
41+
```scala
42+
import scala.util.Random
43+
44+
object CustomerID:
45+
46+
def apply(name: String) = s"$name--${Random.nextLong()}"
47+
48+
def unapply(customerID: String): Option[String] =
49+
val stringArray: Array[String] = customerID.split("--")
50+
if stringArray.tail.nonEmpty then Some(stringArray.head) else None
51+
52+
val customer1ID = CustomerID("Sukyoung") // Sukyoung--23098234908
53+
customer1ID match
54+
case CustomerID(name) => println(name) // выведет Sukyoung
55+
case _ => println("Could not extract a CustomerID")
56+
```
57+
58+
{% endtab %}
59+
60+
{% endtabs %}
61+
3262
Метод `apply` создает `CustomerID` из строки `name`. `unapply` делает обратное, чтобы вернуть `name` обратно. Когда мы вызываем `CustomerID("Sukyoung")`, это сокращенный синтаксис вызова `CustomerID.apply("Sukyoung")`. Когда мы вызываем `case CustomerID(name) => println(name)`, мы на самом деле вызываем метод `unapply`.
3363

3464
При объявлении нового значения можно использовать пример, в котором значение для инициализации переменной получается через извлечение, используя метод `unapply`.
3565

66+
{% tabs extractor-objects_use-case-1 %}
67+
68+
{% tab 'Scala 2 и 3' for=extractor-objects_use-case-1 %}
69+
3670
```scala mdoc
3771
val customer2ID = CustomerID("Nico")
3872
val CustomerID(name) = customer2ID
3973
println(name) // выведет Nico
4074
```
4175

76+
{% endtab %}
77+
78+
{% endtabs %}
79+
4280
Что эквивалентно `val name = CustomerID.unapply(customer2ID).get`.
4381

82+
{% tabs extractor-objects_use-case-2 %}
83+
84+
{% tab 'Scala 2 и 3' for=extractor-objects_use-case-2 %}
85+
4486
```scala mdoc
4587
val CustomerID(name2) = "--asdfasdfasdf"
4688
```
4789

90+
{% endtab %}
91+
92+
{% endtabs %}
93+
4894
Если совпадений нет, то бросается `scala.MatchError`:
4995

96+
{% tabs extractor-objects_use-case-3 %}
97+
98+
{% tab 'Scala 2 и 3' for=extractor-objects_use-case-3 %}
99+
50100
```scala mdoc:crash
51101
val CustomerID(name3) = "-asdfasdfasdf"
52102
```
53103

104+
{% endtab %}
105+
106+
{% endtabs %}
107+
54108
Возвращаемый тип `unapply` выбирается следующим образом:
55109

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)]`.
59113

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

Comments
 (0)