Skip to content

Add types-inferred.md and types-generics.md in russian #2789

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
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
2 changes: 1 addition & 1 deletion _overviews/scala3-book/types-generics.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion _overviews/scala3-book/types-inferred.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
103 changes: 103 additions & 0 deletions _ru/scala3/book/types-generics.md
Original file line number Diff line number Diff line change
@@ -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 %}
65 changes: 65 additions & 0 deletions _ru/scala3/book/types-inferred.md
Original file line number Diff line number Diff line change
@@ -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 _похожим_ на язык с динамической типизацией.
4 changes: 2 additions & 2 deletions _ru/scala3/book/types-introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 — уникальный язык, поскольку он статически типизирован, но часто кажется гибким и динамичным.
Expand Down