You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _ru/tour/package-objects.md
+111-8Lines changed: 111 additions & 8 deletions
Original file line number
Diff line number
Diff line change
@@ -7,18 +7,47 @@ language: ru
7
7
previous-page: packages-and-imports
8
8
---
9
9
10
-
# Объекты Пакета
10
+
Часто бывает удобно иметь определения, доступные для всего пакета,
11
+
когда не нужно придумывать имя для оболочки `object`, которая их содержит.
11
12
12
-
У каждого пакета может существовать связанный с этим пакетом объект (package object), общий для всех членов пакета. Такой объект может быть только один. Любые выражения, содержащиеся в объекте пакета, считаются членами самого пакета.
Объекты пакета могут содержать произвольные виды выражений, а не только переменные и методы. Например, они часто используются для хранения псевдонимов типа и наборов неявных преобразований доступных всему пакету. Объекты пакета могут также наследоваться от классов и трейтов Scala.
16
+
Scala 2 предоставляет _объекты пакета_ (_package objects_) в виде удобного контейнера, общего для всего пакета.
17
+
18
+
Объекты пакета могут содержать произвольные виды выражений, а не только переменные и методы.
19
+
Например, они часто используются для хранения псевдонимов типа и наборов неявных преобразований доступных всему пакету.
20
+
Объекты пакета могут также наследоваться от классов и трейтов Scala.
21
+
22
+
> В будущей версии Scala 3 объекты пакета будут удалены в пользу определений верхнего уровня.
15
23
16
24
По соглашению, исходный код объекта пакета обычно помещается в файл под названием `package.scala`.
17
25
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
+
18
44
См. пример ниже. Предположим, есть старший класс `Fruit` и три наследуемых от него объекта `Fruit` в пакете.
Для примера, следующий объект `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`:
Copy file name to clipboardExpand all lines: _ru/tour/packages-and-imports.md
+96-5Lines changed: 96 additions & 5 deletions
Original file line number
Diff line number
Diff line change
@@ -8,18 +8,28 @@ previous-page: annotations
8
8
next-page: package-objects
9
9
---
10
10
11
-
# Пакеты и Импорт
11
+
# Пакеты и Импорт
12
+
12
13
Scala использует пакеты для указания пространства имен, они позволяют создавать модульную структуру кода.
13
14
14
15
## Создание пакета
16
+
15
17
Пакеты создаются путем объявления одного или нескольких имен пакетов в верхней части файла Scala.
16
18
19
+
{% tabs packages-and-imports_1 %}
20
+
{% tab 'Scala 2 и 3' for=packages-and-imports_1 %}
21
+
17
22
```
18
23
package users
19
24
20
25
class User
21
26
```
27
+
28
+
{% endtab %}
29
+
{% endtabs %}
30
+
22
31
По соглашению пакеты называют тем же именем, что и каталог, содержащий файл Scala. Однако Scala не обращает внимания на расположение файлов. Структура каталогов sbt-проекта для `package users` может выглядеть следующим образом:
32
+
23
33
```
24
34
- ExampleProject
25
35
- build.sbt
@@ -33,8 +43,15 @@ class User
33
43
UserPreferences.scala
34
44
- test
35
45
```
36
-
Обратите внимание, что каталог `users` находится внутри каталога `scala` и как в пакете содержатся несколько файлов Scala. Каждый файл Scala в пакете может иметь одно и то же объявление пакета. Другой способ объявления пакетов - с помощью фигурных скобок:
37
-
```
46
+
47
+
Обратите внимание, что каталог `users` находится внутри каталога `scala` и как в пакете содержатся несколько файлов Scala.
48
+
Каждый файл Scala в пакете может иметь одно и то же объявление пакета.
49
+
Другой способ объявления пакетов - вложить их друг в друга::
Как видите, такой способ позволяет вкладывать пакеты друг в друга, а также обеспечивает отличный контроль за областью видимости и возможностью изоляции.
48
81
49
82
Имя пакета должно быть все в нижнем регистре, и если код разрабатывается в организации имеющей сайт, то следует использовать имя следующего формата: `<домен-верхнего-уровня>.<доменное-имя>.<название-проекта>`. Например, если бы у Google был проект под названием `SelfDrivingCar`, название пакета выглядело бы следующим образом:
50
-
```
83
+
84
+
{% tabs packages-and-imports_3 %}
85
+
{% tab 'Scala 2 и 3' for=packages-and-imports_3 %}
86
+
87
+
```scala
51
88
packagecom.google.selfdrivingcar.camera
52
89
53
90
classLens
54
91
```
92
+
93
+
{% endtab %}
94
+
{% endtabs %}
95
+
55
96
Что может соответствовать следующей структуре каталога: `SelfDrivingCar/src/main/scala/com/google/selfdrivingcar/camera/Lens.scala`.
56
97
57
98
## Импорт
99
+
58
100
Указание `import` открывает доступ к членам (классам, трейтам, функциям и т.д.) в других пакетах. Указание `import` не требуется для доступа к членам одного и того же пакета. Указание `import` избирательны:
Copy file name to clipboardExpand all lines: _ru/tour/pattern-matching.md
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -49,7 +49,7 @@ x match
49
49
{% endtab %}
50
50
{% endtabs %}
51
51
52
-
Значение константы `x` выше представляет собой случайное целое число от 0 до 10. `x` становится левым операндом оператора `match`, а справа - выражением с четырьмя примерами (называемые еще _вариантами_). Последний вариант `_` - позволяет "поймать все оставшиеся варианты" т. е. для любого числа больше 2.
52
+
Значение константы `x` выше представляет собой случайное целое число от 0 до 9. `x` становится левым операндом оператора `match`, а справа - выражением с четырьмя примерами (называемые еще _вариантами_). Последний вариант `_` - позволяет "поймать все оставшиеся варианты" т. е. для любого числа больше 2.
0 commit comments