Skip to content

Commit de2a482

Browse files
committed
Add taste-objects.md in russian
1 parent 30e8899 commit de2a482

File tree

2 files changed

+154
-1
lines changed

2 files changed

+154
-1
lines changed

_overviews/scala3-book/taste-objects.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
title: Singleton Objects
33
type: section
44
description: This section provides an introduction to the use of singleton objects in Scala 3.
5-
languages: [zh-cn]
5+
languages: [ru, zh-cn]
66
num: 12
77
previous-page: taste-functions
88
next-page: taste-collections

_ru/scala3/book/taste-objects.md

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
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: 12
11+
previous-page: taste-functions
12+
next-page: taste-collections
13+
---
14+
15+
16+
В Scala ключевое слово `object` создает объект Singleton (паттерн проектирования "Одиночка").
17+
Другими словами, объект определяет класс, который имеет только один экземпляр.
18+
19+
Объекты имеют несколько применений:
20+
21+
- Они используются для создания коллекций служебных методов.
22+
- _Сопутствующий объект_ — это объект с тем же именем, что и у класса, определенного в этом же файле.
23+
В этой ситуации такой класс также называется _сопутствующим классом_.
24+
- Они используются для реализации трейтов для создания _модулей_.
25+
26+
27+
## “Полезные” методы
28+
29+
Поскольку `object` является "одиночкой", к его методам можно обращаться так же, как к статичным методам в Java классе.
30+
Например, этот объект `StringUtils` содержит небольшой набор методов, связанных со строками:
31+
32+
{% tabs object_1 class=tabs-scala-version %}
33+
{% tab 'Scala 2' for=object_1 %}
34+
```scala
35+
object StringUtils {
36+
def isNullOrEmpty(s: String): Boolean = s == null || s.trim.isEmpty
37+
def leftTrim(s: String): String = s.replaceAll("^\\s+", "")
38+
def rightTrim(s: String): String = s.replaceAll("\\s+$", "")
39+
}
40+
```
41+
{% endtab %}
42+
43+
{% tab 'Scala 3' for=object_1 %}
44+
```scala
45+
object StringUtils:
46+
def isNullOrEmpty(s: String): Boolean = s == null || s.trim.isEmpty
47+
def leftTrim(s: String): String = s.replaceAll("^\\s+", "")
48+
def rightTrim(s: String): String = s.replaceAll("\\s+$", "")
49+
```
50+
{% endtab %}
51+
{% endtabs %}
52+
53+
Поскольку `StringUtils` - это "одиночка", его методы можно вызывать непосредственно для объекта:
54+
55+
{% tabs object_2 %}
56+
{% tab 'Scala 2 and 3' for=object_2 %}
57+
```scala
58+
val x = StringUtils.isNullOrEmpty("") // true
59+
val x = StringUtils.isNullOrEmpty("a") // false
60+
```
61+
{% endtab %}
62+
{% endtabs %}
63+
64+
## Сопутствующие объекты
65+
66+
Сопутствующие класс или объект могут получить доступ к закрытым членам своего компаньона.
67+
Используйте сопутствующий объект для методов и значений, которые не относятся к экземплярам сопутствующего класса.
68+
69+
В этом примере показано, как метод `area` в сопутствующем классе
70+
может получить доступ к приватному методу `calculateArea` в своем сопутствующем объекте:
71+
72+
{% tabs object_3 class=tabs-scala-version %}
73+
{% tab 'Scala 2' for=object_3 %}
74+
```scala
75+
import scala.math._
76+
77+
class Circle(radius: Double) {
78+
import Circle._
79+
def area: Double = calculateArea(radius)
80+
}
81+
82+
object Circle {
83+
private def calculateArea(radius: Double): Double =
84+
Pi * pow(radius, 2.0)
85+
}
86+
87+
val circle1 = new Circle(5.0)
88+
circle1.area // Double = 78.53981633974483
89+
```
90+
{% endtab %}
91+
92+
{% tab 'Scala 3' for=object_3 %}
93+
```scala
94+
import scala.math.*
95+
96+
class Circle(radius: Double):
97+
import Circle.*
98+
def area: Double = calculateArea(radius)
99+
100+
object Circle:
101+
private def calculateArea(radius: Double): Double =
102+
Pi * pow(radius, 2.0)
103+
104+
val circle1 = Circle(5.0)
105+
circle1.area // Double = 78.53981633974483
106+
```
107+
{% endtab %}
108+
{% endtabs %}
109+
110+
## Создание модулей из трейтов
111+
112+
Объекты также можно использовать для реализации трейтов для создания модулей.
113+
Эта техника берет две трейта и объединяет их для создания конкретного `object`-а:
114+
115+
{% tabs object_4 class=tabs-scala-version %}
116+
{% tab 'Scala 2' for=object_4 %}
117+
```scala
118+
trait AddService {
119+
def add(a: Int, b: Int) = a + b
120+
}
121+
122+
trait MultiplyService {
123+
def multiply(a: Int, b: Int) = a * b
124+
}
125+
126+
// реализация трейтов выше в качестве конкретного объекта
127+
object MathService extends AddService with MultiplyService
128+
129+
// использование объекта
130+
import MathService._
131+
println(add(1,1)) // 2
132+
println(multiply(2,2)) // 4
133+
```
134+
{% endtab %}
135+
136+
{% tab 'Scala 3' for=object_4 %}
137+
```scala
138+
trait AddService:
139+
def add(a: Int, b: Int) = a + b
140+
141+
trait MultiplyService:
142+
def multiply(a: Int, b: Int) = a * b
143+
144+
// реализация трейтов выше в качестве конкретного объекта
145+
object MathService extends AddService, MultiplyService
146+
147+
// использование объекта
148+
import MathService.*
149+
println(add(1,1)) // 2
150+
println(multiply(2,2)) // 4
151+
```
152+
{% endtab %}
153+
{% endtabs %}

0 commit comments

Comments
 (0)