From 6e400202f020036cb60685ab0f2d778313c07211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9A=D0=BE=D1=80=D1=81?= =?UTF-8?q?=D0=B0=D0=BA=D0=BE=D0=B2?= Date: Fri, 5 May 2023 09:12:23 +0300 Subject: [PATCH 1/3] Refresh _ru/tour/tuples.md --- _ru/tour/tuples.md | 132 +++++++++++++++++++++++++++++++-------------- _tour/tuples.md | 2 +- 2 files changed, 93 insertions(+), 41 deletions(-) diff --git a/_ru/tour/tuples.md b/_ru/tour/tuples.md index 8af61d5102..288e766eb5 100644 --- a/_ru/tour/tuples.md +++ b/_ru/tour/tuples.md @@ -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-классы + +Пользователям иногда может быть трудно выбирать между кортежами и классами образцами (case classes). +Классы образцы содержат именованные элементы. Имена могут улучшить читаемость некоторых типов кода. +В приведенном выше примере мы могли бы определить планеты, как `case class Planet(name: String, distance: Double)`, +а не использовать кортежи. + +## Дополнительные ресурсы -Иногда бывает трудно выбирать между кортежами и классами образцами. Как правило, классы образцы являются предпочтительным выбором, если класс-контейнер содержащий элементы сам по себе имеет значимый смысл. +- Дополнительная информация о кортежах - в книге [Scala Book](/ru/scala3/book/taste-collections.html#кортежи) diff --git a/_tour/tuples.md b/_tour/tuples.md index cebd7945ce..19166098fb 100644 --- a/_tour/tuples.md +++ b/_tour/tuples.md @@ -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) From 931d2e96a21cdc6c74d665c035b64fb9e8936e60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9A=D0=BE=D1=80=D1=81?= =?UTF-8?q?=D0=B0=D0=BA=D0=BE=D0=B2?= Date: Fri, 5 May 2023 09:13:56 +0300 Subject: [PATCH 2/3] Refresh _ru/tour/tuples.md --- _ru/tour/tuples.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_ru/tour/tuples.md b/_ru/tour/tuples.md index 288e766eb5..33ae0de602 100644 --- a/_ru/tour/tuples.md +++ b/_ru/tour/tuples.md @@ -132,7 +132,7 @@ for (a, b) <- numPairs do ## Кортежи и case-классы -Пользователям иногда может быть трудно выбирать между кортежами и классами образцами (case classes). +Иногда бывает трудно выбирать между кортежами и классами образцами. Классы образцы содержат именованные элементы. Имена могут улучшить читаемость некоторых типов кода. В приведенном выше примере мы могли бы определить планеты, как `case class Planet(name: String, distance: Double)`, а не использовать кортежи. From c1a002a1e81adb783b1091189d2a4d84e2c7b2c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9A=D0=BE=D1=80=D1=81?= =?UTF-8?q?=D0=B0=D0=BA=D0=BE=D0=B2?= Date: Fri, 5 May 2023 19:12:44 +0300 Subject: [PATCH 3/3] Fix the comment --- _ru/tour/tuples.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_ru/tour/tuples.md b/_ru/tour/tuples.md index 33ae0de602..8f1550c473 100644 --- a/_ru/tour/tuples.md +++ b/_ru/tour/tuples.md @@ -130,10 +130,10 @@ for (a, b) <- numPairs do {% endtabs %} -## Кортежи и case-классы +## Кортежи и кейс-классы -Иногда бывает трудно выбирать между кортежами и классами образцами. -Классы образцы содержат именованные элементы. Имена могут улучшить читаемость некоторых типов кода. +Иногда бывает трудно выбирать между кортежами и кейс-классами. +Кейс-классы содержат именованные элементы. Имена могут улучшить читаемость некоторых типов кода. В приведенном выше примере мы могли бы определить планеты, как `case class Planet(name: String, distance: Double)`, а не использовать кортежи.