@@ -15,35 +15,35 @@ next-page: control-structures
15
15
16
16
## Все значения имеют тип
17
17
18
- В Scala все значения имеют тип, включая числовые значения и функции.
18
+ В Scala все значения имеют тип, включая числовые значения и функции.
19
19
На приведенной ниже диаграмме показано подмножество иерархии типов.
20
20
21
21
<a href =" {{ site.baseurl }}/resources/images/scala3-book/hierarchy.svg " ><img style =" width :100% " src =" {{ site.baseurl }}/resources/images/scala3-book/hierarchy.svg " alt =" Scala 3 Type Hierarchy " ></a >
22
22
23
23
## Иерархия типов Scala
24
24
25
- ` Any ` - это супертип всех типов, также называемый ** верхним типом** (** the top type** ).
25
+ ` Any ` - это супертип всех типов, также называемый ** верхним типом** (** the top type** ).
26
26
Он определяет универсальные методы, такие как ` equals ` , ` hashCode ` и ` toString ` .
27
27
28
- У верхнего типа ` Any ` есть подтип [ ` Matchable ` ] [ matchable ] , который используется для обозначения всех типов,
29
- для которых возможно выполнить pattern matching (сопоставление с образцом).
30
- Важно гарантировать вызов свойства _ “параметричность”_ , что вкратце означает,
31
- что мы не можем сопоставлять шаблоны для значений типа ` Any ` , а только для значений, которые являются подтипом ` Matchable ` .
28
+ У верхнего типа ` Any ` есть подтип [ ` Matchable ` ] [ matchable ] , который используется для обозначения всех типов,
29
+ для которых возможно выполнить pattern matching (сопоставление с образцом).
30
+ Важно гарантировать вызов свойства _ “параметричность”_ , что вкратце означает,
31
+ что мы не можем сопоставлять шаблоны для значений типа ` Any ` , а только для значений, которые являются подтипом ` Matchable ` .
32
32
[ Справочная документация] [ matchable ] содержит более подробную информацию о ` Matchable ` .
33
33
34
34
` Matchable ` содержит два важных подтипа: ` AnyVal ` и ` AnyRef ` .
35
35
36
- * ` AnyVal ` * представляет типы значений.
37
- Существует несколько предопределенных типов значений, и они non-nullable:
38
- ` Double ` , ` Float ` , ` Long ` , ` Int ` , ` Short ` , ` Byte ` , ` Char ` , ` Unit ` и ` Boolean ` .
36
+ * ` AnyVal ` * представляет типы значений.
37
+ Существует несколько предопределенных типов значений, и они non-nullable:
38
+ ` Double ` , ` Float ` , ` Long ` , ` Int ` , ` Short ` , ` Byte ` , ` Char ` , ` Unit ` и ` Boolean ` .
39
39
` Unit ` - это тип значения, который не несет никакой значимой информации. Существует ровно один экземпляр ` Unit ` - ` () ` .
40
40
41
- * ` AnyRef ` * представляет ссылочные типы. Все типы, не являющиеся значениями, определяются как ссылочные типы.
42
- Каждый пользовательский тип в Scala является подтипом ` AnyRef ` .
41
+ * ` AnyRef ` * представляет ссылочные типы. Все типы, не являющиеся значениями, определяются как ссылочные типы.
42
+ Каждый пользовательский тип в Scala является подтипом ` AnyRef ` .
43
43
Если Scala используется в контексте среды выполнения Java, ` AnyRef ` соответствует ` java.lang.Object ` .
44
44
45
- В языках, основанных на операторах, ` void ` используется для методов, которые ничего не возвращают.
46
- В Scala для методов, которые не имеют возвращаемого значения,
45
+ В языках, основанных на операторах, ` void ` используется для методов, которые ничего не возвращают.
46
+ В Scala для методов, которые не имеют возвращаемого значения,
47
47
такие как следующий метод, для той же цели используется ` Unit ` :
48
48
49
49
{% tabs unit %}
@@ -54,7 +54,7 @@ def printIt(a: Any): Unit = println(a)
54
54
{% endtab %}
55
55
{% endtabs %}
56
56
57
- Вот пример, демонстрирующий, что строки, целые числа, символы, логические значения и функции являются экземплярами ` Any `
57
+ Вот пример, демонстрирующий, что строки, целые числа, символы, логические значения и функции являются экземплярами ` Any `
58
58
и могут обрабатываться так же, как и любой другой объект:
59
59
60
60
{% tabs any %}
@@ -73,8 +73,8 @@ list.foreach(element => println(element))
73
73
{% endtab %}
74
74
{% endtabs %}
75
75
76
- Код определяет список значений типа ` List[Any] ` .
77
- Список инициализируется элементами различных типов, но каждый из них является экземпляром ` scala.Any ` ,
76
+ Код определяет список значений типа ` List[Any] ` .
77
+ Список инициализируется элементами различных типов, но каждый из них является экземпляром ` scala.Any ` ,
78
78
поэтому мы можем добавить их в список.
79
79
80
80
Вот вывод программы:
89
89
90
90
## Типы значений в Scala
91
91
92
- Как показано выше, числовые типы Scala расширяют ` AnyVal ` , и все они являются полноценными объектами.
92
+ Как показано выше, числовые типы Scala расширяют ` AnyVal ` , и все они являются полноценными объектами.
93
93
В этих примерах показано, как объявлять переменные этих числовых типов:
94
94
95
95
{% tabs anyval %}
@@ -105,9 +105,9 @@ val f: Float = 3.0
105
105
{% endtab %}
106
106
{% endtabs %}
107
107
108
- В первых четырех примерах, если явно не указать тип, то тип числа ` 1 ` по умолчанию будет равен ` Int ` ,
109
- поэтому, если нужен один из других типов данных — ` Byte ` , ` Long ` или ` Short ` — необходимо явно объявить эти типы.
110
- Числа с десятичной дробью (например, ` 2.0 ` ) по умолчанию будут иметь тип ` Double ` ,
108
+ В первых четырех примерах, если явно не указать тип, то тип числа ` 1 ` по умолчанию будет равен ` Int ` ,
109
+ поэтому, если нужен один из других типов данных — ` Byte ` , ` Long ` или ` Short ` — необходимо явно объявить эти типы.
110
+ Числа с десятичной дробью (например, ` 2.0 ` ) по умолчанию будут иметь тип ` Double ` ,
111
111
поэтому, если необходим ` Float ` , нужно объявить ` Float ` явно, как показано в последнем примере.
112
112
113
113
Поскольку ` Int ` и ` Double ` являются числовыми типами по умолчанию, их можно создавать без явного объявления типа данных:
@@ -121,7 +121,7 @@ val x = 1.0 // по умолчанию Double
121
121
{% endtab %}
122
122
{% endtabs %}
123
123
124
- Также можно добавить символы ` L ` , ` D ` , and ` F ` (или их эквивалент в нижнем регистре)
124
+ Также можно добавить символы ` L ` , ` D ` , and ` F ` (или их эквивалент в нижнем регистре)
125
125
для того, чтобы задать ` Long ` , ` Double ` или ` Float ` значения:
126
126
127
127
{% tabs type-post %}
@@ -145,7 +145,7 @@ val c = 'a'
145
145
{% endtab %}
146
146
{% endtabs %}
147
147
148
- Как показано, заключайте строки в двойные кавычки или тройные кавычки для многострочных строк,
148
+ Как показано, заключайте строки в двойные кавычки или тройные кавычки для многострочных строк,
149
149
а одиночный символ заключайте в одинарные кавычки.
150
150
151
151
Типы данных и их диапазоны:
@@ -176,7 +176,7 @@ val b = BigDecimal(123_456.789)
176
176
{% endtab %}
177
177
{% endtabs %}
178
178
179
- Где ` Double ` и ` Float ` являются приблизительными десятичными числами,
179
+ Где ` Double ` и ` Float ` являются приблизительными десятичными числами,
180
180
а ` BigDecimal ` используется для точной арифметики, например, при работе с валютой.
181
181
182
182
` BigInt ` и ` BigDecimal ` поддерживают все привычные числовые операторы:
@@ -200,7 +200,7 @@ val d = b * b // scala.math.BigInt = 1524157875019052100
200
200
201
201
### Интерполяция строк
202
202
203
- Интерполяция строк обеспечивает очень удобный способ использования переменных внутри строк.
203
+ Интерполяция строк обеспечивает очень удобный способ использования переменных внутри строк.
204
204
Например, учитывая эти три переменные:
205
205
206
206
{% tabs string-inside1 %}
@@ -239,9 +239,9 @@ println(s"x.abs = ${x.abs}") // печатает "x.abs = 1"
239
239
240
240
#### Другие интерполяторы
241
241
242
- То ` s ` , что вы помещаете перед строкой, является лишь одним из возможных интерполяторов.
243
- Если вы используете ` f ` вместо ` s ` , вы можете использовать ` printf ` - синтаксис форматирования стиля в строке.
244
- Кроме того, строковый интерполятор — это всего лишь специальный метод, и вы можете определить свой собственный.
242
+ То ` s ` , что вы помещаете перед строкой, является лишь одним из возможных интерполяторов.
243
+ Если вы используете ` f ` вместо ` s ` , вы можете использовать ` printf ` - синтаксис форматирования стиля в строке.
244
+ Кроме того, строковый интерполятор — это всего лишь специальный метод, и вы можете определить свой собственный.
245
245
Например, некоторые библиотеки баз данных определяют очень мощный интерполятор ` sql ` .
246
246
247
247
### Многострочные строки
@@ -314,7 +314,7 @@ val number: Int = face // 9786
314
314
{% endtab %}
315
315
{% endtabs %}
316
316
317
- Вы можете привести к типу, только если нет потери информации.
317
+ Вы можете привести к типу, только если нет потери информации.
318
318
В противном случае вам нужно четко указать приведение типов:
319
319
320
320
{% tabs cast2 %}
@@ -327,29 +327,29 @@ val z: Long = y // Ошибка
327
327
{% endtab %}
328
328
{% endtabs %}
329
329
330
- Вы также можете привести ссылочный тип к подтипу.
330
+ Вы также можете привести ссылочный тип к подтипу.
331
331
Это будет рассмотрено в книге позже.
332
332
333
333
## ` Nothing ` и ` null `
334
334
335
- ` Nothing ` является подтипом всех типов, также называемым ** нижним типом** (** the bottom type** ).
336
- Нет значения, которое имело бы тип ` Nothing ` .
337
- Он обычно сигнализирует о прекращении, таком как thrown exception, выходе из программы или бесконечном цикле -
335
+ ` Nothing ` является подтипом всех типов, также называемым ** нижним типом** (** the bottom type** ).
336
+ Нет значения, которое имело бы тип ` Nothing ` .
337
+ Он обычно сигнализирует о прекращении, таком как thrown exception, выходе из программы или бесконечном цикле -
338
338
т.е. это тип выражения, который не вычисляется до определенного значения, или метод, который нормально не возвращается.
339
339
340
- ` Null ` - это подтип всех ссылочных типов (т.е. любой подтип ` AnyRef ` ).
341
- Он имеет единственное значение, определяемое ключевым словом ` null ` .
342
- В настоящее время применение ` null ` считается плохой практикой.
343
- Его следует использовать в основном для взаимодействия с другими языками JVM.
344
- Опция компилятора ` opt-in ` изменяет статус ` Null ` , делая все ссылочные типы non-nullable.
340
+ ` Null ` - это подтип всех ссылочных типов (т.е. любой подтип ` AnyRef ` ).
341
+ Он имеет единственное значение, определяемое ключевым словом ` null ` .
342
+ В настоящее время применение ` null ` считается плохой практикой.
343
+ Его следует использовать в основном для взаимодействия с другими языками JVM.
344
+ Опция компилятора ` opt-in ` изменяет статус ` Null ` , делая все ссылочные типы non-nullable.
345
345
Этот параметр может [ стать значением по умолчанию] [ safe-null ] в будущей версии Scala.
346
346
347
- В то же время ` null ` почти никогда не следует использовать в коде Scala.
347
+ В то же время ` null ` почти никогда не следует использовать в коде Scala.
348
348
Альтернативы ` null ` обсуждаются в главе о [ функциональном программировании] [ fp ] и в [ документации API] [ option-api ] .
349
349
350
350
[ reference] : {{ site.scala3ref }}/overview.html
351
351
[ matchable] : {{ site.scala3ref }}/other-new-features/matchable.html
352
- [ interpolation] : {% link _ overviews/core /string-interpolation.md %}
352
+ [ interpolation] : {% link _ overviews/scala3-book /string-interpolation.md %}
353
353
[ fp] : {% link _ overviews/scala3-book/fp-intro.md %}
354
354
[ option-api ] : https://scala-lang.org/api/3.x/scala/Option.html
355
355
[ safe-null] : {{ site.scala3ref }}/experimental/explicit-nulls.html
0 commit comments