Skip to content

Commit c640e4d

Browse files
Add contextual abstraction in ru (#2868)
* Add ca-contextual-abstractions-intro.md in russian * Add ca-contextual-abstractions-intro.md in russian * Add ca-contextual-abstractions-intro.md in russian
1 parent 5d69b13 commit c640e4d

9 files changed

+274
-14
lines changed

_includes/version-specific-notice.html

+22-8
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,29 @@
22
<blockquote class="help-info">
33
<i class="fa fa-info"></i><span style="margin-left: 0.5rem">
44
{% if include.language == 'scala3' %}
5-
This doc page is specific to Scala 3,
6-
and may cover new concepts not available in Scala 2. Unless
7-
otherwise stated, all the code examples in this page assume
8-
you are using Scala 3.
5+
{% if include.page-language == 'ru' %}
6+
Эта страница документа относится к Scala 3 и
7+
может охватывать новые концепции, недоступные в Scala 2.
8+
Если не указано явно, все примеры кода на этой странице
9+
предполагают, что вы используете Scala 3.
10+
{% else %}
11+
This doc page is specific to Scala 3,
12+
and may cover new concepts not available in Scala 2. Unless
13+
otherwise stated, all the code examples in this page assume
14+
you are using Scala 3.
15+
{% endif %}
916
{% else if include.language == 'scala2' %}
10-
This doc page is specific to features shipped in Scala 2,
11-
which have either been removed in Scala 3 or replaced by an
12-
alternative. Unless otherwise stated, all the code examples
13-
in this page assume you are using Scala 2.
17+
{% if include.page-language == 'ru' %}
18+
Эта страница документа относится к функциям, представленным в Scala 2,
19+
которые либо были удалены в Scala 3, либо заменены альтернативными.
20+
Если не указано явно, все примеры кода на этой странице предполагают,
21+
что вы используете Scala 2.
22+
{% else %}
23+
This doc page is specific to features shipped in Scala 2,
24+
which have either been removed in Scala 3 or replaced by an
25+
alternative. Unless otherwise stated, all the code examples
26+
in this page assume you are using Scala 2.
27+
{% endif %}
1428
{% endif %}
1529
</span>
1630
</blockquote>

_layouts/multipage-overview.html

+6-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@
1818
{% else if page.scala2 %}
1919
{% assign versionSpecificLang = 'scala2' %}
2020
{% endif %}
21-
{% include version-specific-notice.html language=versionSpecificLang %}
21+
{% if page.language %}
22+
{% assign pageLanguage = page.language %}
23+
{% else %}
24+
{% assign pageLanguage = 'en' %}
25+
{% endif %}
26+
{% include version-specific-notice.html language=versionSpecificLang page-language=pageLanguage %}
2227
{% endif %}
2328
<noscript>
2429
<blockquote>

_overviews/scala3-book/ca-contextual-abstractions-intro.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
title: Contextual Abstractions
33
type: chapter
44
description: This chapter provides an introduction to the Scala 3 concept of Contextual Abstractions.
5-
languages: [zh-cn]
5+
languages: [ru, zh-cn]
66
num: 59
77
previous-page: types-others
88
next-page: ca-extension-methods

_overviews/scala3-book/ca-extension-methods.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
title: Extension Methods
33
type: section
44
description: This page demonstrates how Extension Methods work in Scala 3.
5-
languages: [zh-cn]
5+
languages: [ru, zh-cn]
66
num: 60
77
previous-page: ca-contextual-abstractions-intro
88
next-page: ca-context-parameters
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
---
2+
layout: multipage-overview
3+
title: Контекстные абстракции
4+
scala3: true
5+
partof: scala3-book
6+
overview-name: "Scala 3 — Book"
7+
type: chapter
8+
description: В этой главе представлено введение в концепцию контекстных абстракций Scala 3.
9+
language: ru
10+
num: 59
11+
previous-page: types-others
12+
next-page: ca-extension-methods
13+
---
14+
15+
## Предпосылка
16+
17+
Контекстные абстракции — это способ абстрагироваться от контекста.
18+
Они представляют собой единую парадигму с большим разнообразием вариантов использования, среди которых:
19+
20+
- реализация тайп классов (_type classes_)
21+
- установление контекста
22+
- внедрение зависимости (_dependency injection_)
23+
- выражение возможностей
24+
- вычисление новых типов и доказательство взаимосвязей между ними
25+
26+
В этом отношении Scala оказала влияние на другие языки. Например, трейты в Rust или protocol extensions Swift.
27+
Предложения по дизайну также представлены для Kotlin в качестве разрешения зависимостей во время компиляции,
28+
для C# в качестве Shapes и Extensions или для F# в качестве Traits.
29+
Контекстные абстракции также являются общей особенностью средств доказательства теорем, таких как Coq или Agda.
30+
31+
Несмотря на то, что в этих проектах используется разная терминология,
32+
все они являются вариантами основной идеи вывода терминов (term inference):
33+
учитывая тип, компилятор синтезирует "канонический" термин, который имеет этот тип.
34+
35+
## Редизайн в Scala 3
36+
37+
В Scala 2 контекстные абстракции поддерживаются пометкой `implicit` определений (методов и значений) или параметров
38+
(см. [Параметры контекста]({% link _overviews/scala3-book/ca-context-parameters.md %})).
39+
40+
Scala 3 включает в себя переработку контекстных абстракций.
41+
Хотя эти концепции постепенно "открывались" в Scala 2, теперь они хорошо известны и понятны, и редизайн использует эти знания.
42+
43+
Дизайн Scala 3 фокусируется на **намерении**, а не на **механизме**.
44+
Вместо того, чтобы предлагать одну очень мощную функцию имплицитов,
45+
Scala 3 предлагает несколько функций, ориентированных на варианты использования:
46+
47+
- **Расширение классов задним числом**.
48+
В Scala 2 методы расширения должны были кодироваться с использованием [неявных преобразований][implicit-conversions] или [неявных классов]({% link _overviews/core/implicit-classes.md %}).
49+
Напротив, в Scala 3 [методы расширения][extension-methods] теперь встроены непосредственно в язык, что приводит к улучшению сообщений об ошибках и улучшению вывода типов.
50+
51+
- **Абстрагирование контекстной информации**.
52+
[Предложения Using][givens] позволяют программистам абстрагироваться от информации,
53+
которая доступна в контексте вызова и должна передаваться неявно.
54+
В качестве улучшения по сравнению со Scala 2 подразумевается, что предложения using могут быть указаны по типу,
55+
освобождая сигнатуры функций от имен переменных, на которые никогда не ссылаются явно.
56+
57+
- **Предоставление экземпляров тайп-классов**.
58+
[Given экземпляры][givens] позволяют программистам определять _каноническое значение_ определенного типа.
59+
Это делает программирование с [тайп-классами][type-classes] более простым без утечек деталей реализации.
60+
61+
- **Неявное преобразование одного типа в другой**.
62+
Неявное преобразование было [переработано с нуля][implicit-conversions] как экземпляры тайп-класса `Conversion`.
63+
64+
- **Контекстные абстракции высшего порядка**.
65+
_Совершенно новая_ функция [контекстных функций][contextual-functions] делает контекстные абстракции объектами первого класса.
66+
Они являются важным инструментом для авторов библиотек и позволяют выражать лаконичный DSL.
67+
68+
- **Полезная обратная связь от компилятора**.
69+
Если компилятор не может разрешить неявный параметр, теперь он предлагает [предложения по импорту](https://www.scala-lang.org/blog/2020/05/05/scala-3-import-suggestions.html), которые могут решить проблему.
70+
71+
## Преимущества
72+
73+
Эти изменения в Scala 3 обеспечивают лучшее разделение вывода терминов от остального языка:
74+
75+
- существует единственный способ определить данные
76+
- существует единственный способ ввести неявные параметры и аргументы
77+
- существует отдельный способ [импорта givens][given-imports], который не позволяет им прятаться в море обычного импорта
78+
- существует единственный способ определить [неявное преобразование][implicit-conversions], которое четко обозначено как таковое и не требует специального синтаксиса
79+
80+
К преимуществам этих изменений относятся:
81+
82+
- новый дизайн позволяет избежать взаимодействия функций и делает язык более согласованным
83+
- implicits становятся более легкими для изучения и более сложными для злоупотреблений
84+
- значительно улучшается ясность 95% программ Scala, использующих implicits
85+
- есть потенциал, чтобы сделать вывод термов однозначным способом, который также доступен и удобен.
86+
87+
В этой главе в следующих разделах представлены многие из этих новых функций.
88+
89+
[givens]: {% link _overviews/scala3-book/ca-context-parameters.md %}
90+
[given-imports]: {% link _overviews/scala3-book/ca-given-imports.md %}
91+
[implicit-conversions]: {% link _overviews/scala3-book/ca-implicit-conversions.md %}
92+
[extension-methods]: {% link _overviews/scala3-book/ca-extension-methods.md %}
93+
[context-bounds]: {% link _overviews/scala3-book/ca-context-bounds.md %}
94+
[type-classes]: {% link _overviews/scala3-book/ca-type-classes.md %}
95+
[equality]: {% link _overviews/scala3-book/ca-multiversal-equality.md %}
96+
[contextual-functions]: {{ site.scala3ref }}/contextual/context-functions.html
+145
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
---
2+
layout: multipage-overview
3+
title: Методы расширения
4+
scala3: true
5+
partof: scala3-book
6+
overview-name: "Scala 3 — Book"
7+
type: section
8+
description: В этой главе представлена работа методов расширения в Scala 3.
9+
language: ru
10+
num: 60
11+
previous-page: ca-contextual-abstractions-intro
12+
next-page:
13+
versionSpecific: true
14+
---
15+
16+
В Scala 2 аналогичного результата можно добиться с помощью [неявных классов]({% link _overviews/core/implicit-classes.md %}).
17+
18+
---
19+
20+
Методы расширения позволяют добавлять методы к типу после того, как он был определен,
21+
т.е. они позволяют добавлять новые методы в закрытые классы.
22+
Например, представьте, что кто-то создал класс `Circle`:
23+
24+
{% tabs ext1 %}
25+
{% tab 'Scala 2 и 3' %}
26+
27+
```scala
28+
case class Circle(x: Double, y: Double, radius: Double)
29+
```
30+
31+
{% endtab %}
32+
{% endtabs %}
33+
34+
Теперь представим, что необходим метод `circumference`, но нет возможности изменить исходный код `Circle`.
35+
До того как концепция вывода терминов была введена в языки программирования,
36+
единственное, что можно было сделать, это написать метод в отдельном классе или объекте, подобном этому:
37+
38+
{% tabs ext2 class=tabs-scala-version %}
39+
{% tab 'Scala 2' %}
40+
41+
```scala
42+
object CircleHelpers {
43+
def circumference(c: Circle): Double = c.radius * math.Pi * 2
44+
}
45+
```
46+
47+
{% endtab %}
48+
{% tab 'Scala 3' %}
49+
50+
```scala
51+
object CircleHelpers:
52+
def circumference(c: Circle): Double = c.radius * math.Pi * 2
53+
```
54+
55+
{% endtab %}
56+
{% endtabs %}
57+
58+
Затем этот метод можно было использовать следующим образом:
59+
60+
{% tabs ext3 %}
61+
{% tab 'Scala 2 и 3' %}
62+
63+
```scala
64+
val aCircle = Circle(2, 3, 5)
65+
66+
// без использования метода расширения
67+
CircleHelpers.circumference(aCircle)
68+
```
69+
70+
{% endtab %}
71+
{% endtabs %}
72+
73+
Но методы расширения позволяют создать метод `circumference` для работы с экземплярами `Circle`:
74+
75+
{% tabs ext4 %}
76+
{% tab 'Только в Scala 3' %}
77+
78+
```scala
79+
extension (c: Circle)
80+
def circumference: Double = c.radius * math.Pi * 2
81+
```
82+
83+
{% endtab %}
84+
{% endtabs %}
85+
86+
В этом коде:
87+
88+
- `Circle` — это тип, к которому будет добавлен метод расширения `circumference`
89+
- Синтаксис `c: Circle` позволяет ссылаться на переменную `c` в методах расширения
90+
91+
Затем в коде метод `circumference` можно использовать так же, как если бы он был изначально определен в классе `Circle`:
92+
93+
{% tabs ext5 %}
94+
{% tab 'Только в Scala 3' %}
95+
96+
```scala
97+
aCircle.circumference
98+
```
99+
100+
{% endtab %}
101+
{% endtabs %}
102+
103+
### Импорт методов расширения
104+
105+
Представим, что `circumference` определен в пакете `lib` - его можно импортировать с помощью
106+
107+
{% tabs ext6 %}
108+
{% tab 'Только в Scala 3' %}
109+
110+
```scala
111+
import lib.circumference
112+
113+
aCircle.circumference
114+
```
115+
116+
{% endtab %}
117+
{% endtabs %}
118+
119+
Если импорт отсутствует, то компилятор выводит подробное сообщение об ошибке, подсказывая возможный импорт, например так:
120+
121+
```text
122+
value circumference is not a member of Circle, but could be made available as an extension method.
123+
124+
The following import might fix the problem:
125+
126+
import lib.circumference
127+
```
128+
129+
## Обсуждение
130+
131+
Ключевое слово `extension` объявляет о намерении определить один или несколько методов расширения для типа, заключенного в круглые скобки.
132+
Чтобы определить для типа несколько методов расширения, используется следующий синтаксис:
133+
134+
{% tabs ext7 %}
135+
{% tab 'Только в Scala 3' %}
136+
137+
```scala
138+
extension (c: Circle)
139+
def circumference: Double = c.radius * math.Pi * 2
140+
def diameter: Double = c.radius * 2
141+
def area: Double = math.Pi * c.radius * c.radius
142+
```
143+
144+
{% endtab %}
145+
{% endtabs %}

_ru/scala3/book/types-adts-gadts.md

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ language: ru
1010
num: 53
1111
previous-page: types-union
1212
next-page: types-variance
13+
versionSpecific: true
1314
---
1415

1516
<span class="tag tag-inline">Только в Scala 3</span>

_ru/scala3/book/types-others.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ description: В этом разделе упоминаются другие ра
99
language: ru
1010
num: 58
1111
previous-page: types-dependent-function
12-
next-page:
12+
next-page: ca-contextual-abstractions-intro
1313
---
1414

1515
В Scala есть несколько других расширенных типов, которые не показаны в этой книге, в том числе:

_ru/scala3/book/types-union.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ language: ru
1010
num: 52
1111
previous-page: types-intersection
1212
next-page: types-adts-gadts
13+
versionSpecific: true
1314
---
1415

15-
<span class="tag tag-inline">Только в Scala 3</span>
16-
1716
Используемый для типов `|` оператор создает так называемый _тип объединения_ (_union type_).
1817
Тип `А | B` представляет значения, которые относятся **либо** к типу `A`, **либо** к типу `B`.
1918

0 commit comments

Comments
 (0)