From 8647ee5f22c8e54fefba6222e7ad477ed62c8b6f 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: Sat, 15 Jul 2023 10:50:04 +0300 Subject: [PATCH 1/2] Update compound-types.md in russian --- _ru/tour/compound-types.md | 71 +++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/_ru/tour/compound-types.md b/_ru/tour/compound-types.md index 5d0a49aa0e..876bbaf42a 100644 --- a/_ru/tour/compound-types.md +++ b/_ru/tour/compound-types.md @@ -8,13 +8,19 @@ next-page: self-types previous-page: abstract-type-members --- -Иногда необходимо выразить, то что тип объекта является подтипом нескольких других типов. В Scala это можно выразить с помощью *составных типов*, которые являются объединением нескольких типов объектов. +Иногда необходимо выразить, то что тип объекта является подтипом нескольких других типов. + +В Scala это можно выразить с помощью _типов пересечений_ (или _составных типов_ в Scala 2), +которые являются объединением нескольких типов объектов. Предположим, у нас есть два трейта: `Cloneable` и `Resetable`: +{% tabs compound-types_1 class=tabs-scala-version %} +{% tab 'Scala 2' for=compound-types_1 %} + ```scala mdoc trait Cloneable extends java.lang.Cloneable { - override def clone(): Cloneable = { + override def clone(): Cloneable = { // создает публичный метод 'clone' super.clone().asInstanceOf[Cloneable] } } @@ -23,9 +29,26 @@ trait Resetable { } ``` -Теперь предположим, что мы хотим написать функцию `cloneAndReset`, которая берет объект, клонирует его и сбрасывает (Reset) состояние исходного объекта: +{% endtab %} +{% tab 'Scala 3' for=compound-types_1 %} +```scala +trait Cloneable extends java.lang.Cloneable: + override def clone(): Cloneable = // создает публичный метод 'clone' + super.clone().asInstanceOf[Cloneable] +trait Resetable: + def reset: Unit ``` + +{% endtab %} +{% endtabs %} + +Теперь предположим, что мы хотим написать функцию `cloneAndReset`, которая берет объект, клонирует его и сбрасывает (Reset) состояние исходного объекта: + +{% tabs compound-types_2 class=tabs-scala-version %} +{% tab 'Scala 2' for=compound-types_2 %} + +```scala mdoc:fail def cloneAndReset(obj: ?): Cloneable = { val cloned = obj.clone() obj.reset @@ -33,17 +56,49 @@ def cloneAndReset(obj: ?): Cloneable = { } ``` -Возникает вопрос, какой тип параметр `obj` должна принимать наша объединённая функция. Если это `Cloneable`, то объект может использовать метод `clone`, но не `reset`; если это `Resetable` мы можем использовать метод `reset`, но нет операции `clone`. Чтобы избежать приведения типа в такой ситуации, мы можем указать, что тип `obj` является и `Cloneable`, и `Resetable`. Этот совместный тип в Scala записывается как: `Cloneable with Resetable`. +{% endtab %} +{% tab 'Scala 3' for=compound-types_2 %} + +```scala +def cloneAndReset(obj: ?): Cloneable = + val cloned = obj.clone() + obj.reset + cloned +``` + +{% endtab %} +{% endtabs %} + +Возникает вопрос, какой тип параметра `obj` должна принимать наша объединённая функция. Если это `Cloneable`, то объект может использовать метод `clone`, но не `reset`; если это `Resetable` мы можем использовать метод `reset`, но нет операции `clone`. Чтобы избежать приведения типа в такой ситуации, мы можем указать, что тип `obj` является и `Cloneable`, и `Resetable`. + +{% tabs compound-types_3 class=tabs-scala-version %} +{% tab 'Scala 2' for=compound-types_3 %} +Этот совместный тип в Scala записывается как: `Cloneable with Resetable`. Вот обновленная функция: -``` +```scala mdoc:fail def cloneAndReset(obj: Cloneable with Resetable): Cloneable = { //... } ``` -Составные типы могут состоять из нескольких типов объектов, и они могут содержать единый доработанный объект, в котором будут доработаны характеристики существующих членов объекта. -Общая форма записи: `A with B with C ... { доработанный объект }` +Обратите внимание, что у вас может быть более двух типов: `A with B with C with ...`. +Это означает то же самое, что и: `(...(A with B) with C) with ... )` + +{% endtab %} +{% tab 'Scala 3' for=compound-types_3 %} +Этот совместный тип в Scala записывается как: `Cloneable & Resetable`. + +Вот обновленная функция: + +```scala +def cloneAndReset(obj: Cloneable & Resetable): Cloneable = { + //... +} +``` -Пример использования таких доработок приведен на странице об [объединении классов с примесями](mixin-class-composition.html). +Обратите внимание, что у вас может быть более двух типов: `A & B & C & ...`. +`&` является ассоциативным, поэтому скобки могут быть добавлены вокруг любой части без изменения значения. +{% endtab %} +{% endtabs %} From cb175746a89ac6664c4d93441a15e281703d2d13 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: Tue, 1 Aug 2023 08:45:47 +0300 Subject: [PATCH 2/2] Add mark "Scala 3 Only" in ru --- _ru/scala3/book/types-dependent-function.md | 1 + _ru/scala3/book/types-opaque-types.md | 6 +++++- _ru/scala3/book/types-others.md | 3 ++- _ru/scala3/book/types-structural.md | 6 ++++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/_ru/scala3/book/types-dependent-function.md b/_ru/scala3/book/types-dependent-function.md index 43cfba3a7c..88750e2ec5 100644 --- a/_ru/scala3/book/types-dependent-function.md +++ b/_ru/scala3/book/types-dependent-function.md @@ -10,6 +10,7 @@ language: ru num: 57 previous-page: types-structural next-page: types-others +versionSpecific: true --- _Зависимый тип функции_ (_dependent function type_) описывает типы функций, diff --git a/_ru/scala3/book/types-opaque-types.md b/_ru/scala3/book/types-opaque-types.md index 54522dafd9..f6942738a9 100644 --- a/_ru/scala3/book/types-opaque-types.md +++ b/_ru/scala3/book/types-opaque-types.md @@ -10,9 +10,12 @@ language: ru num: 55 previous-page: types-variance next-page: types-structural +versionSpecific: true --- -В Scala 3 _непрозрачные псевдонимы типов_ (_opaque type aliases_) обеспечивают абстракции типов без каких-либо **накладных расходов**. +_Непрозрачные псевдонимы типов_ (_opaque type aliases_) обеспечивают абстракцию типов без каких-либо **накладных расходов**. + +В Scala 2 аналогичный результат можно получить с помощью [классов значений][value-classes]. ## Накладные расходы на абстракцию @@ -172,3 +175,4 @@ val d: Double = log2 // ERROR: Found Logarithm required Double Как показано выше, непрозрачные типы удобны в использовании и очень хорошо интегрируются с [функцией методов расширения][extension]. [extension]: {% link _overviews/scala3-book/ca-extension-methods.md %} +[value-classes]: {% link _overviews/core/value-classes.md %} diff --git a/_ru/scala3/book/types-others.md b/_ru/scala3/book/types-others.md index 25a0437b1d..5f01514837 100644 --- a/_ru/scala3/book/types-others.md +++ b/_ru/scala3/book/types-others.md @@ -10,6 +10,7 @@ language: ru num: 58 previous-page: types-dependent-function next-page: ca-contextual-abstractions-intro +versionSpecific: true --- В Scala есть несколько других расширенных типов, которые не показаны в этой книге, в том числе: @@ -22,6 +23,6 @@ next-page: ca-contextual-abstractions-intro - Типы уточнения - Вид полиморфизма -Дополнительные сведения об этих типах см. в [Справочной документации][reference]. +Дополнительные сведения об этих типах см. в [Справочной документации Scala 3][reference]. [reference]: {{ site.scala3ref }}/overview.html diff --git a/_ru/scala3/book/types-structural.md b/_ru/scala3/book/types-structural.md index 911bc02cbe..103e6db389 100644 --- a/_ru/scala3/book/types-structural.md +++ b/_ru/scala3/book/types-structural.md @@ -10,8 +10,14 @@ language: ru num: 56 previous-page: types-opaque-types next-page: types-dependent-function +versionSpecific: true --- +_Scala 2 содержит более слабую форму структурных типов, основанную на Java reflection, +достигаемую с помощью `import scala.language.reflectiveCalls`_. + +## Введение + Некоторые варианты использования, такие как моделирование доступа к базе данных, более удобны в динамически типизированных языках, чем в статически типизированных языках. С динамически типизированными языками естественно моделировать строку как запись или объект