Skip to content

Commit 41a18fe

Browse files
Tour packages actualization in ru (#2886)
1 parent 9def5fa commit 41a18fe

File tree

3 files changed

+208
-14
lines changed

3 files changed

+208
-14
lines changed

_ru/tour/package-objects.md

Lines changed: 111 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,47 @@ language: ru
77
previous-page: packages-and-imports
88
---
99

10-
# Объекты Пакета
10+
Часто бывает удобно иметь определения, доступные для всего пакета,
11+
когда не нужно придумывать имя для оболочки `object`, которая их содержит.
1112

12-
У каждого пакета может существовать связанный с этим пакетом объект (package object), общий для всех членов пакета. Такой объект может быть только один. Любые выражения, содержащиеся в объекте пакета, считаются членами самого пакета.
13+
{% tabs pkg-obj-vs-top-lvl_1 class=tabs-scala-version %}
14+
{% tab 'Scala 2' for=pkg-obj-vs-top-lvl_1 %}
1315

14-
Объекты пакета могут содержать произвольные виды выражений, а не только переменные и методы. Например, они часто используются для хранения псевдонимов типа и наборов неявных преобразований доступных всему пакету. Объекты пакета могут также наследоваться от классов и трейтов Scala.
16+
Scala 2 предоставляет _объекты пакета_ (_package objects_) в виде удобного контейнера, общего для всего пакета.
17+
18+
Объекты пакета могут содержать произвольные виды выражений, а не только переменные и методы.
19+
Например, они часто используются для хранения псевдонимов типа и наборов неявных преобразований доступных всему пакету.
20+
Объекты пакета могут также наследоваться от классов и трейтов Scala.
21+
22+
> В будущей версии Scala 3 объекты пакета будут удалены в пользу определений верхнего уровня.
1523
1624
По соглашению, исходный код объекта пакета обычно помещается в файл под названием `package.scala`.
1725

26+
Каждому пакету разрешено иметь один объект пакета.
27+
Любые выражения, содержащиеся в объекте пакета, считаются членами самого пакета.
28+
29+
{% endtab %}
30+
{% tab 'Scala 3' for=pkg-obj-vs-top-lvl_1 %}
31+
32+
В Scala 3 любое определение может быть объявлено на верхнем уровне пакета.
33+
Например, классы, перечисления, методы и переменные.
34+
35+
Любые определения, размещенные на верхнем уровне пакета, считаются членами самого пакета.
36+
37+
> В Scala 2 верхнеуровневый метод, определения типов и переменных должны были быть заключены в **объект пакета**.
38+
> Их все еще можно использовать в Scala 3 для обратной совместимости.
39+
> Вы можете увидеть, как они работают, переключая вкладки.
40+
41+
{% endtab %}
42+
{% endtabs %}
43+
1844
См. пример ниже. Предположим, есть старший класс `Fruit` и три наследуемых от него объекта `Fruit` в пакете.
1945

2046
`gardening.fruits`:
2147

48+
{% tabs pkg-obj-vs-top-lvl_2 %}
49+
{% tab 'Scala 2 и 3' for=pkg-obj-vs-top-lvl_2 %}
50+
2251
```
2352
// в файле gardening/fruits/Fruit.scala
2453
package gardening.fruits
@@ -29,9 +58,15 @@ object Plum extends Fruit("Plum", "blue")
2958
object Banana extends Fruit("Banana", "yellow")
3059
```
3160

61+
{% endtab %}
62+
{% endtabs %}
63+
3264
Теперь предположим, что мы хотим поместить переменную `planted` и метод `showFruit` непосредственно в пакет `gardening`.
3365
Вот как это делается:
3466

67+
{% tabs pkg-obj-vs-top-lvl_3 class=tabs-scala-version %}
68+
{% tab 'Scala 2' for=pkg-obj-vs-top-lvl_3 %}
69+
3570
```
3671
// в файле gardening/fruits/package.scala
3772
package gardening
@@ -43,11 +78,31 @@ package object fruits {
4378
}
4479
```
4580

46-
Для примера, следующий объект `PrintPlanted` импортирует `planted` и `showFruit` точно так же, как с вариантом импорта класса `Fruit`, используя групповой стиль импорта пакета gardening.fruits:
81+
{% endtab %}
82+
{% tab 'Scala 3' for=pkg-obj-vs-top-lvl_3 %}
83+
84+
```
85+
// в файле gardening/fruits/package.scala
86+
package gardening.fruits
87+
88+
val planted = List(Apple, Plum, Banana)
89+
def showFruit(fruit: Fruit): Unit =
90+
println(s"${fruit.name}s are ${fruit.color}")
91+
```
92+
93+
{% endtab %}
94+
{% endtabs %}
95+
96+
Для примера, следующий объект `PrintPlanted` импортирует `planted` и `showFruit` точно так же, как с вариантом импорта класса `Fruit`,
97+
используя групповой стиль импорта пакета `gardening.fruits`:
98+
99+
{% tabs pkg-obj-vs-top-lvl_4 class=tabs-scala-version %}
100+
{% tab 'Scala 2' for=pkg-obj-vs-top-lvl_4 %}
47101

48102
```
49103
// в файле PrintPlanted.scala
50104
import gardening.fruits._
105+
51106
object PrintPlanted {
52107
def main(args: Array[String]): Unit = {
53108
for (fruit <- planted) {
@@ -57,10 +112,58 @@ object PrintPlanted {
57112
}
58113
```
59114

60-
Объекты пакета ведут себя также, как и любые другие объекты. Это означает, что вы можете использовать наследование, при этом сразу нескольких трейтов:
115+
{% endtab %}
116+
{% tab 'Scala 3' for=pkg-obj-vs-top-lvl_4 %}
61117

62118
```
63-
package object fruits extends FruitAliases with FruitHelpers {
64-
// здесь располагаются вспомогательные классы и переменные
65-
}
119+
// в файле PrintPlanted.scala
120+
import gardening.fruits.*
121+
122+
@main def printPlanted(): Unit =
123+
for fruit <- planted do
124+
showFruit(fruit)
125+
```
126+
127+
{% endtab %}
128+
{% endtabs %}
129+
130+
### Объединение нескольких определений на уровне пакета
131+
132+
Часто в вашем проекте может быть несколько повторно используемых определений,
133+
заданных в различных модулях, которые вы хотите агрегировать на верхнем уровне пакета.
134+
135+
Например, некоторые вспомогательные методы в трейте `FruitHelpers`
136+
и некоторые псевдонимы терминов/типов в свойстве `FruitAliases`.
137+
Вот как вы можете разместить все их определения на уровне пакета `fruit`:
138+
139+
{% tabs pkg-obj-vs-top-lvl_5 class=tabs-scala-version %}
140+
{% tab 'Scala 2' for=pkg-obj-vs-top-lvl_5 %}
141+
142+
Объекты пакета ведут себя также, как и любые другие объекты.
143+
Это означает, что вы можете использовать наследование, при этом сразу нескольких трейтов:
144+
145+
```
146+
package gardening
147+
148+
// `fruits` наследует свои элементы от родителей.
149+
package object fruits extends FruitAliases with FruitHelpers
150+
```
151+
152+
{% endtab %}
153+
{% tab 'Scala 3' for=pkg-obj-vs-top-lvl_5 %}
154+
155+
В Scala 3 предпочтительно использовать `export` для объединения членов из нескольких объектов в единую область видимости.
156+
Здесь мы определяем приватные объекты, которые смешиваются с вспомогательными трейтами,
157+
а затем экспортируют их элементы на верхнем уровне:
158+
66159
```
160+
package gardening.fruits
161+
162+
private object FruitAliases extends FruitAliases
163+
private object FruitHelpers extends FruitHelpers
164+
165+
export FruitHelpers.*, FruitAliases.*
166+
```
167+
168+
{% endtab %}
169+
{% endtabs %}

_ru/tour/packages-and-imports.md

Lines changed: 96 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,28 @@ previous-page: annotations
88
next-page: package-objects
99
---
1010

11-
# Пакеты и Импорт
11+
# Пакеты и Импорт
12+
1213
Scala использует пакеты для указания пространства имен, они позволяют создавать модульную структуру кода.
1314

1415
## Создание пакета
16+
1517
Пакеты создаются путем объявления одного или нескольких имен пакетов в верхней части файла Scala.
1618

19+
{% tabs packages-and-imports_1 %}
20+
{% tab 'Scala 2 и 3' for=packages-and-imports_1 %}
21+
1722
```
1823
package users
1924
2025
class User
2126
```
27+
28+
{% endtab %}
29+
{% endtabs %}
30+
2231
По соглашению пакеты называют тем же именем, что и каталог, содержащий файл Scala. Однако Scala не обращает внимания на расположение файлов. Структура каталогов sbt-проекта для `package users` может выглядеть следующим образом:
32+
2333
```
2434
- ExampleProject
2535
- build.sbt
@@ -33,8 +43,15 @@ class User
3343
UserPreferences.scala
3444
- test
3545
```
36-
Обратите внимание, что каталог `users` находится внутри каталога `scala` и как в пакете содержатся несколько файлов Scala. Каждый файл Scala в пакете может иметь одно и то же объявление пакета. Другой способ объявления пакетов - с помощью фигурных скобок:
37-
```
46+
47+
Обратите внимание, что каталог `users` находится внутри каталога `scala` и как в пакете содержатся несколько файлов Scala.
48+
Каждый файл Scala в пакете может иметь одно и то же объявление пакета.
49+
Другой способ объявления пакетов - вложить их друг в друга::
50+
51+
{% tabs packages-and-imports_2 class=tabs-scala-version %}
52+
{% tab 'Scala 2' for=packages-and-imports_2 %}
53+
54+
```scala
3855
package users {
3956
package administrators {
4057
class NormalUser
@@ -44,39 +61,113 @@ package users {
4461
}
4562
}
4663
```
64+
65+
{% endtab %}
66+
{% tab 'Scala 3' for=packages-and-imports_2 %}
67+
68+
```scala
69+
package users:
70+
package administrators:
71+
class NormalUser
72+
73+
package normalusers:
74+
class NormalUser
75+
```
76+
77+
{% endtab %}
78+
{% endtabs %}
79+
4780
Как видите, такой способ позволяет вкладывать пакеты друг в друга, а также обеспечивает отличный контроль за областью видимости и возможностью изоляции.
4881

4982
Имя пакета должно быть все в нижнем регистре, и если код разрабатывается в организации имеющей сайт, то следует использовать имя следующего формата: `<домен-верхнего-уровня>.<доменное-имя>.<название-проекта>`. Например, если бы у Google был проект под названием `SelfDrivingCar`, название пакета выглядело бы следующим образом:
50-
```
83+
84+
{% tabs packages-and-imports_3 %}
85+
{% tab 'Scala 2 и 3' for=packages-and-imports_3 %}
86+
87+
```scala
5188
package com.google.selfdrivingcar.camera
5289

5390
class Lens
5491
```
92+
93+
{% endtab %}
94+
{% endtabs %}
95+
5596
Что может соответствовать следующей структуре каталога: `SelfDrivingCar/src/main/scala/com/google/selfdrivingcar/camera/Lens.scala`.
5697

5798
## Импорт
99+
58100
Указание `import` открывает доступ к членам (классам, трейтам, функциям и т.д.) в других пакетах. Указание `import` не требуется для доступа к членам одного и того же пакета. Указание `import` избирательны:
101+
102+
{% tabs packages-and-imports_4 class=tabs-scala-version %}
103+
{% tab 'Scala 2' for=packages-and-imports_4 %}
104+
59105
```
60106
import users._ // групповой импорт всего пакета users
61107
import users.User // импортировать только User
62108
import users.{User, UserPreferences} // импортировать только User, UserPreferences
63109
import users.{UserPreferences => UPrefs} // импортировать и переименовать
64110
```
65111

112+
{% endtab %}
113+
{% tab 'Scala 3' for=packages-and-imports_4 %}
114+
115+
```
116+
import users.* // групповой импорт всего пакета users, кроме given
117+
import users.given // импорт всех given пакета users
118+
import users.User // импортировать только User
119+
import users.{User, UserPreferences} // импортировать только User, UserPreferences
120+
import users.UserPreferences as UPrefs // импортировать и переименовать
121+
```
122+
123+
{% endtab %}
124+
{% endtabs %}
125+
66126
Одним из отличий Scala от Java является то, что импорт можно использовать где угодно:
67127

128+
{% tabs packages-and-imports_5 class=tabs-scala-version %}
129+
{% tab 'Scala 2' for=packages-and-imports_5 %}
130+
68131
```scala mdoc
69132
def sqrtplus1(x: Int) = {
70133
import scala.math.sqrt
71134
sqrt(x) + 1.0
72135
}
73136
```
74-
В случае возникновения конфликта имен и необходимости импортировать что-либо из корня проекта, имя пакета должно начинаться с префикса `_root_`:
137+
138+
{% endtab %}
139+
{% tab 'Scala 3' for=packages-and-imports_5 %}
140+
141+
```scala
142+
def sqrtplus1(x: Int) =
143+
import scala.math.sqrt
144+
sqrt(x) + 1.0
75145
```
146+
147+
{% endtab %}
148+
{% endtabs %}
149+
150+
В случае возникновения конфликта имен и необходимости импортировать что-либо из корня проекта, имя пакета должно начинаться с префикса `_root_`:
151+
152+
{% tabs packages-and-imports_6 class=tabs-scala-version %}
153+
{% tab 'Scala 2' for=packages-and-imports_6 %}
154+
155+
```scala
76156
package accounts
77157

78158
import _root_.users._
79159
```
80160

161+
{% endtab %}
162+
{% tab 'Scala 3' for=packages-and-imports_6 %}
163+
164+
```scala
165+
package accounts
166+
167+
import _root_.users.*
168+
```
169+
170+
{% endtab %}
171+
{% endtabs %}
81172

82173
Примечание: Пакеты `scala` и `java.lang`, а также `object Predef` импортируются по умолчанию.

_ru/tour/pattern-matching.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ x match
4949
{% endtab %}
5050
{% endtabs %}
5151

52-
Значение константы `x` выше представляет собой случайное целое число от 0 до 10. `x` становится левым операндом оператора `match`, а справа - выражением с четырьмя примерами (называемые еще _вариантами_). Последний вариант `_` - позволяет "поймать все оставшиеся варианты" т. е. для любого числа больше 2.
52+
Значение константы `x` выше представляет собой случайное целое число от 0 до 9. `x` становится левым операндом оператора `match`, а справа - выражением с четырьмя примерами (называемые еще _вариантами_). Последний вариант `_` - позволяет "поймать все оставшиеся варианты" т. е. для любого числа больше 2.
5353

5454
Сопоставление с примером возвращает значение.
5555

0 commit comments

Comments
 (0)