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
Классы образцы (Case classes) похожи на обычные классы с несколькими ключевыми отличиями, о которых мы поговорим ниже. Классы образцы хороши для моделирования неизменяемых данных. На следующей странице обзора вы увидите, насколько они полезны для участия в [сопоставлении с примером](pattern-matching.html).
12
+
Классы образцы (Case classes) похожи на обычные классы с несколькими ключевыми отличиями, о которых мы поговорим ниже.
13
+
Классы образцы хороши для моделирования неизменяемых данных.
14
+
На следующей странице обзора вы увидите, насколько они полезны для участия в [сопоставлении с примером](pattern-matching.html).
13
15
14
16
## Объявление класса образца
17
+
15
18
Минимальный вариант объявления класса образца: указание ключевого слова `case class`, название и список параметров (которые могут быть пустыми). Пример:
19
+
20
+
{% tabs case-classe_Book %}
21
+
22
+
{% tab 'Scala 2 и 3' for=case-classe_Book %}
23
+
16
24
```scala mdoc
17
25
caseclassBook(isbn: String)
18
26
19
27
valfrankenstein=Book("978-0486282114")
20
28
```
21
-
Обратите внимание, что ключевое слово `new` не было использовано для создания экземпляра класса `Book`. Это связано с тем, что классы образцы по умолчанию имеют объект компаньон с методом `apply`, который берет на себя заботу о создании экземпляра класса.
29
+
30
+
{% endtab %}
31
+
32
+
{% endtabs %}
33
+
34
+
Обратите внимание, что ключевое слово `new` не было использовано для создания экземпляра класса `Book`.
35
+
Это связано с тем, что классы образцы по умолчанию имеют объект компаньон с методом `apply`,
36
+
который берет на себя заботу о создании экземпляра класса.
22
37
23
38
При создании класса образца с параметрами, эти параметры являются публичными и неизменяемыми.
39
+
40
+
{% tabs case-classe_Message_define %}
41
+
42
+
{% tab 'Scala 2 и 3' for=case-classe_Message_define %}
43
+
24
44
```
25
45
case class Message(sender: String, recipient: String, body: String)
message1.sender = "[email protected]" // эта строка не компилируется
30
50
```
51
+
52
+
{% endtab %}
53
+
54
+
{% endtabs %}
55
+
31
56
Вы не можете переназначить `message1.sender`, потому что это `val` (т.е. константа). Возможно использовать `var` в классах образцах, но это не рекомендуется.
32
57
33
58
## Сравнение
59
+
34
60
Классы образцы сравниваются по структуре, а не по ссылкам:
35
-
```
61
+
62
+
{% tabs case-classe_Message_compare %}
63
+
64
+
{% tab 'Scala 2 и 3' for=case-classe_Message_compare %}
В Scala возможно объявление метода вкладывать в тело другого метода. Это реализовано в следующем примере, в котором метод `factorial` используется для вычисления факториала заданного числа:
0 commit comments