diff --git a/_overviews/scala3-book/types-generics.md b/_overviews/scala3-book/types-generics.md index 25ace5eca4..c44c29c9ac 100644 --- a/_overviews/scala3-book/types-generics.md +++ b/_overviews/scala3-book/types-generics.md @@ -2,7 +2,7 @@ title: Generics type: section description: This section introduces and demonstrates generics in Scala 3. -languages: [zh-cn] +languages: [ru, zh-cn] num: 49 previous-page: types-inferred next-page: types-intersection diff --git a/_overviews/scala3-book/types-inferred.md b/_overviews/scala3-book/types-inferred.md index 733a8d540c..828907d048 100644 --- a/_overviews/scala3-book/types-inferred.md +++ b/_overviews/scala3-book/types-inferred.md @@ -2,7 +2,7 @@ title: Inferred Types type: section description: This section introduces and demonstrates inferred types in Scala 3 -languages: [zh-cn] +languages: [ru, zh-cn] num: 48 previous-page: types-introduction next-page: types-generics diff --git a/_ru/scala3/book/types-generics.md b/_ru/scala3/book/types-generics.md new file mode 100644 index 0000000000..799a85e3d5 --- /dev/null +++ b/_ru/scala3/book/types-generics.md @@ -0,0 +1,103 @@ +--- +layout: multipage-overview +title: Параметризованные типы +scala3: true +partof: scala3-book +overview-name: "Scala 3 — Book" +type: section +description: В этом разделе представлены параметризованные типы в Scala 3. +language: ru +num: 49 +previous-page: types-inferred +next-page: +--- + +Универсальные (_generic_) классы (или trait-ы) принимают тип в качестве _параметра_ в квадратных скобках `[...]`. +Для обозначения параметров типа согласно конвенции Scala используется одна заглавная буква (например, `A`). +Затем этот тип можно использовать внутри класса по мере необходимости +для параметров экземпляра метода или для возвращаемых типов: + +{% tabs stack class=tabs-scala-version %} + +{% tab 'Scala 2' %} + +```scala +// здесь мы объявляем параметр типа A +// v +class Stack[A] { + private var elements: List[A] = Nil + // ^ + // здесь мы ссылаемся на этот тип + // v + def push(x: A): Unit = + elements = elements.prepended(x) + def peek: A = elements.head + def pop(): A = { + val currentTop = peek + elements = elements.tail + currentTop + } +} +``` + +{% endtab %} + +{% tab 'Scala 3' %} + +```scala +// здесь мы объявляем параметр типа A +// v +class Stack[A]: + private var elements: List[A] = Nil + // ^ + // здесь мы ссылаемся на этот тип + // v + def push(x: A): Unit = + elements = elements.prepended(x) + def peek: A = elements.head + def pop(): A = + val currentTop = peek + elements = elements.tail + currentTop +``` + +{% endtab %} +{% endtabs %} + +Эта реализация класса `Stack` принимает любой тип в качестве параметра. +Прелесть параметризованных типов состоит в том, +что теперь можно создавать `Stack[Int]`, `Stack[String]` и т.д., +что позволяет повторно использовать реализацию `Stack` для произвольных типов элементов. + +Пример создания и использования `Stack[Int]`: + +{% tabs stack-usage class=tabs-scala-version %} +{% tab 'Scala 2' %} + +```scala +val stack = new Stack[Int] +stack.push(1) +stack.push(2) +println(stack.pop()) // выводит 2 +println(stack.pop()) // выводит 1 +``` + +{% endtab %} + +{% tab 'Scala 3' %} + +```scala +val stack = Stack[Int] +stack.push(1) +stack.push(2) +println(stack.pop()) // выводит 2 +println(stack.pop()) // выводит 1 +``` + +{% endtab %} +{% endtabs %} + +> Подробности о том, как выразить вариантность с помощью универсальных типов, +> см. в разделе ["Вариантность"][variance]. + +[variance]: {% link _overviews/scala3-book/types-variance.md %} diff --git a/_ru/scala3/book/types-inferred.md b/_ru/scala3/book/types-inferred.md new file mode 100644 index 0000000000..70c44fcc9d --- /dev/null +++ b/_ru/scala3/book/types-inferred.md @@ -0,0 +1,65 @@ +--- +layout: multipage-overview +title: Определение типов +scala3: true +partof: scala3-book +overview-name: "Scala 3 — Book" +type: section +description: В этом разделе представлены и демонстрируются выводимые типы в Scala 3. +language: ru +num: 48 +previous-page: types-introduction +next-page: types-generics +--- + +Как и в других статически типизированных языках программирования, +в Scala тип можно _объявить_ при создании новой переменной: + +{% tabs xy %} +{% tab 'Scala 2 и 3' %} + +```scala +val x: Int = 1 +val y: Double = 1 +``` + +{% endtab %} +{% endtabs %} + +В этих примерах типы _явно_ объявлены как `Int` и `Double` соответственно. +Однако в Scala обычно необязательно указывать тип при объявлении переменной: + +{% tabs abm %} +{% tab 'Scala 2 и 3' %} + +```scala +val a = 1 +val b = List(1, 2, 3) +val m = Map(1 -> "one", 2 -> "two") +``` + +{% endtab %} +{% endtabs %} + +Когда вы это сделаете, Scala сама _выведет_ типы, как показано в следующей сессии REPL: + +{% tabs abm2 %} +{% tab 'Scala 2 и 3' %} + +```scala +scala> val a = 1 +val a: Int = 1 + +scala> val b = List(1, 2, 3) +val b: List[Int] = List(1, 2, 3) + +scala> val m = Map(1 -> "one", 2 -> "two") +val m: Map[Int, String] = Map(1 -> one, 2 -> two) +``` + +{% endtab %} +{% endtabs %} + +Действительно, большинство переменных определяются без указания типа, +и способность Scala автоматически определять его — это одна из особенностей, +которая делает Scala _похожим_ на язык с динамической типизацией. diff --git a/_ru/scala3/book/types-introduction.md b/_ru/scala3/book/types-introduction.md index 656b821de4..49b3cbfb49 100644 --- a/_ru/scala3/book/types-introduction.md +++ b/_ru/scala3/book/types-introduction.md @@ -4,12 +4,12 @@ title: Типы и система типов scala3: true partof: scala3-book overview-name: "Scala 3 — Book" -type: section +type: chapter description: В этой главе представлено введение в типы и систему типов Scala 3. language: ru num: 47 previous-page: fp-summary -next-page: +next-page: types-inferred --- Scala — уникальный язык, поскольку он статически типизирован, но часто кажется гибким и динамичным.