Skip to content

Refresh _ru/tour/tuples.md #2791

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 92 additions & 40 deletions _ru/tour/tuples.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,82 +9,134 @@ previous-page: traits
topics: tuples
---

В Scala, кортеж (Тuple) это класс контейнер содержащий упорядоченный набор элементов различного типа.
Кортежи неизменяемы.
В Scala, кортеж (Тuple) - это контейнер содержащий упорядоченный набор элементов различного типа.
Кортежи неизменяемы.

Кортежи могут пригодиться, когда нам нужно вернуть сразу несколько значений из функции.

Кортеж может быть создан как:

{% tabs tuple-construction %}

{% tab 'Scala 2 и 3' for=tuple-construction %}

```scala mdoc
val ingredient = ("Sugar" , 25):Tuple2[String, Int]
val ingredient = ("Sugar", 25)
```
Такая запись создает кортеж размерности 2, содержащий пару элементов String и Int.

Кортежи в Скале - представлены серией классов: Tuple2, Tuple3 и т.д., до Tuple22.
Таким образом, создавая кортеж с n элементами (n лежащими между 2 и 22), Скала просто создает один из соответствующих классов, который параметризован типом входящих в состав элементов.
{% endtab %}

{% endtabs %}

В нашем примере, составляющие тип Tuple2[String, Int].
Такая запись создает кортеж, содержащий пару элементов `String` и `Int`.

Выводимый тип `ingredient` - это `(String, Int)`.

## Доступ к элементам

Доступ к элементам кортежа осуществляется при помощи синтаксиса подчеркивания.
'tuple._n' дает n-ый элемент (столько, сколько существует элементов).
{% tabs tuple-indexed-access class=tabs-scala-version %}

{% tab 'Scala 2' for=tuple-indexed-access %}

Один из способов доступа к элементам кортежа — по их позиции.
`tuple._n` дает n-ый элемент (столько, сколько существует элементов).

```scala mdoc
println(ingredient._1) // Sugar

println(ingredient._2) // 25
```

## Распаковка данных кортежа
{% endtab %}

Scala кортежи также поддерживают [распаковку](extractor-objects.html).
{% tab 'Scala 3' for=tuple-indexed-access %}

```scala mdoc
val (name, quantity) = ingredient
Один из способов доступа к элементам кортежа — по их позиции.
Доступ к отдельным элементам осуществляется с помощью `tuple(0)`, `tuple(1)` и так далее.

```scala
println(ingredient(0)) // Sugar
println(ingredient(1)) // 25
```

{% endtab %}

{% endtabs %}

## Сопоставление с образцом для кортежей

Кортеж также можно распаковать с помощью сопоставления с образцом:

println(name) // Sugar
{% tabs tuple-extraction %}

{% tab 'Scala 2 и 3' for=tuple-extraction %}

```scala mdoc
val (name, quantity) = ingredient
println(name) // Sugar
println(quantity) // 25
```

Распаковка данных кортежа может быть использована в [сопоставлении с примером](pattern-matching.html)
{% endtab %}

{% endtabs %}

Здесь выводимый тип `name` - `String` и выводимый тип `quantity` - `Int`.

Вот еще один пример сопоставления с образцом кортежа:

{% tabs tuple-foreach-patmat %}

{% tab 'Scala 2 и 3' for=tuple-foreach-patmat %}

```scala mdoc
val planetDistanceFromSun = List(("Mercury", 57.9), ("Venus", 108.2), ("Earth", 149.6 ), ("Mars", 227.9), ("Jupiter", 778.3))

planetDistanceFromSun.foreach{ tuple => {

tuple match {

case ("Mercury", distance) => println(s"Mercury is $distance millions km far from Sun")

case p if(p._1 == "Venus") => println(s"Venus is ${p._2} millions km far from Sun")

case p if(p._1 == "Earth") => println(s"Blue planet is ${p._2} millions km far from Sun")

case _ => println("Too far....")

}

}

val planets =
List(("Mercury", 57.9), ("Venus", 108.2), ("Earth", 149.6),
("Mars", 227.9), ("Jupiter", 778.3))
planets.foreach {
case ("Earth", distance) =>
println(s"Our planet is $distance million kilometers from the sun")
case _ =>
}
```

Или в ['for' выражении](for-comprehensions.html).
{% endtab %}

{% endtabs %}

Или, в _for-comprehension_:

{% tabs tuple-for-extraction class=tabs-scala-version %}

{% tab 'Scala 2' for=tuple-for-extraction %}

```scala mdoc
val numPairs = List((2, 5), (3, -7), (20, 56))

for ((a, b) <- numPairs) {

println(a * b)

}
```

Значение () типа Unit по свой сути совпадает со значением () типа Tuple0. Может быть только одно значение такого типа, так как в нём нет элементов.
{% endtab %}

{% tab 'Scala 3' for=tuple-for-extraction %}

```scala
val numPairs = List((2, 5), (3, -7), (20, 56))
for (a, b) <- numPairs do
println(a * b)
```

{% endtab %}

{% endtabs %}

## Кортежи и кейс-классы

Иногда бывает трудно выбирать между кортежами и кейс-классами.
Кейс-классы содержат именованные элементы. Имена могут улучшить читаемость некоторых типов кода.
В приведенном выше примере мы могли бы определить планеты, как `case class Planet(name: String, distance: Double)`,
а не использовать кортежи.

## Дополнительные ресурсы

Иногда бывает трудно выбирать между кортежами и классами образцами. Как правило, классы образцы являются предпочтительным выбором, если класс-контейнер содержащий элементы сам по себе имеет значимый смысл.
- Дополнительная информация о кортежах - в книге [Scala Book](/ru/scala3/book/taste-collections.html#кортежи)
2 changes: 1 addition & 1 deletion _tour/tuples.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,4 +126,4 @@ Users may sometimes find it hard to choose between tuples and case classes. Case

## More resources

* Learn more about tuples in the [Scala Book](/overviews/scala-book/tuples.html)
* Learn more about tuples in the [Scala Book](/scala3/book/taste-collections.html#tuples)