Skip to content

Commit 40a5a48

Browse files
artemkorsakovjulienrf
authored andcommitted
Update for-comprehensions.md in russian
1 parent 853bd54 commit 40a5a48

File tree

2 files changed

+97
-14
lines changed

2 files changed

+97
-14
lines changed

_ru/tour/for-comprehensions.md

Lines changed: 82 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,54 +8,125 @@ next-page: generic-classes
88
previous-page: extractor-objects
99
---
1010

11-
Scala предлагает простую запись для выражения *последовательных преобразований*. Эти преобразования можно упростить используя специальный синтаксис `for выражения` (for comprehension), который записывается как `for (enumerators) yield e`, где `enumerators` относятся к списку перечислителей, разделенных точкой с запятой. Где отдельный такой "перечислитель" (*enumerator*) является либо генератором, который вводит новые переменные, либо фильтром. For-выражение вычисляет тело `e` (которое связанно с тем что генерирует *enumerator*) и возвращает последовательность вычислений.
11+
Scala предлагает простую запись для выражения _последовательных преобразований_. Эти преобразования можно упростить используя специальный синтаксис `for выражения` (for comprehension), который записывается как `for (enumerators) yield e`, где `enumerators` относятся к списку перечислителей, разделенных точкой с запятой. Где отдельный такой "перечислитель" (_enumerator_) является либо генератором, который вводит новые переменные, либо фильтром. For-выражение вычисляет тело `e` (которое связанно с тем что генерирует _enumerator_) и возвращает последовательность вычислений.
1212

1313
Вот пример:
1414

15+
{% tabs for-comprehensions-01 class=tabs-scala-version %}
16+
{% tab 'Scala 2' for=for-comprehensions-01 %}
17+
1518
```scala mdoc
1619
case class User(name: String, age: Int)
1720

18-
val userBase = List(User("Travis", 28),
21+
val userBase = List(
22+
User("Travis", 28),
1923
User("Kelly", 33),
2024
User("Jennifer", 44),
2125
User("Dennis", 23))
2226

23-
val twentySomethings = for (user <- userBase if (user.age >=20 && user.age < 30))
24-
yield user.name // т. е. добавить результат к списку
27+
val twentySomethings =
28+
for (user <- userBase if user.age >=20 && user.age < 30)
29+
yield user.name // т. е. добавить результат к списку
2530

26-
twentySomethings.foreach(name => println(name)) // выводит "Travis Dennis"
31+
twentySomethings.foreach(println) // выводит "Travis Dennis"
2732
```
28-
`for`-выражение, используется с оператором `yield`, на самом деле создает `List`. Потому что мы указали `yield user.name` (то есть вывести имя пользователя), получаем `List[String]`. `user <- userBase` и есть наш генератор, а `if (user.age >=20 && user.age < 30)` - это фильтр который отфильтровывает пользователей, не достигших 30-летнего возраста.
33+
34+
{% endtab %}
35+
{% tab 'Scala 3' for=for-comprehensions-01 %}
36+
37+
```scala
38+
case class User(name: String, age: Int)
39+
40+
val userBase = List(
41+
User("Travis", 28),
42+
User("Kelly", 33),
43+
User("Jennifer", 44),
44+
User("Dennis", 23))
45+
46+
val twentySomethings =
47+
for user <- userBase if user.age >=20 && user.age < 30
48+
yield user.name // т. е. добавить результат к списку
49+
50+
twentySomethings.foreach(println) // выводит "Travis Dennis"
51+
```
52+
53+
{% endtab %}
54+
{% endtabs %}
55+
56+
`for`-выражение, используется с оператором `yield`, на самом деле создает `List`. Потому что мы указали `yield user.name` (то есть вывести имя пользователя), получаем `List[String]`. `user <- userBase` и есть наш генератор, а `if (user.age >=20 && user.age < 30)` - это фильтр который отфильтровывает пользователей, не достигших 30-летнего возраста.
2957

3058
Ниже приведен более сложный пример использования двух генераторов. Он вычисляет все пары чисел между `0` и `n-1`, сумма которых равна заданному значению `v`:
3159

60+
{% tabs for-comprehensions-02 class=tabs-scala-version %}
61+
{% tab 'Scala 2' for=for-comprehensions-02 %}
62+
3263
```scala mdoc
3364
def foo(n: Int, v: Int) =
3465
for (i <- 0 until n;
35-
j <- i until n if i + j == v)
66+
j <- 0 until n if i + j == v)
3667
yield (i, j)
3768

38-
foo(10, 10) foreach {
69+
foo(10, 10).foreach {
3970
case (i, j) =>
40-
println(s"($i, $j) ") // выводит (1, 9) (2, 8) (3, 7) (4, 6) (5, 5)
71+
println(s"($i, $j) ") // выводит (1, 9) (2, 8) (3, 7) (4, 6) (5, 5) (6, 4) (7, 3) (8, 2) (9, 1)
4172
}
73+
```
74+
75+
{% endtab %}
76+
{% tab 'Scala 3' for=for-comprehensions-02 %}
77+
78+
```scala
79+
def foo(n: Int, v: Int) =
80+
for i <- 0 until n
81+
j <- 0 until n if i + j == v
82+
yield (i, j)
4283

84+
foo(10, 10).foreach {
85+
(i, j) => println(s"($i, $j) ") // выводит (1, 9) (2, 8) (3, 7) (4, 6) (5, 5) (6, 4) (7, 3) (8, 2) (9, 1)
86+
}
4387
```
88+
89+
{% endtab %}
90+
{% endtabs %}
91+
4492
Здесь `n == 10` и `v == 10`. На первой итерации `i == 0` и `j == 0` так `i + j != v` и поэтому ничего не выдается. `j` увеличивается еще в 9 раз, прежде чем `i` увеличивается до `1`. Без фильтра `if` будет просто напечатано следующее:
45-
```scala
4693

94+
```scala
4795
(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (0, 5) (0, 6) (0, 7) (0, 8) (0, 9) (1, 0) ...
4896
```
4997

5098
Обратите внимание, что for-выражение не ограничивается только работой со списками. Каждый тип данных, поддерживающий операции `withFilter`, `map`, and `flatMap` (с соответствующими типами), может быть использован в for-выражении.
5199

52100
Вы можете обойтись без `yield` в for-выражении. В таком случае, результатом будет `Unit`. Это может быть полезным для выполнения кода основанного на побочных эффектах. Вот программа, эквивалентная предыдущей, но без использования `yield`:
53101

102+
{% tabs for-comprehensions-03 class=tabs-scala-version %}
103+
{% tab 'Scala 2' for=for-comprehensions-03 %}
104+
54105
```scala mdoc:nest
55106
def foo(n: Int, v: Int) =
56107
for (i <- 0 until n;
57-
j <- i until n if i + j == v)
108+
j <- 0 until n if i + j == v)
58109
println(s"($i, $j)")
59110

60111
foo(10, 10)
61112
```
113+
114+
{% endtab %}
115+
116+
{% tab 'Scala 3' for=for-comprehensions-03 %}
117+
118+
```scala
119+
def foo(n: Int, v: Int) =
120+
for i <- 0 until n
121+
j <- 0 until n if i + j == v
122+
do println(s"($i, $j)")
123+
124+
foo(10, 10)
125+
```
126+
127+
{% endtab %}
128+
{% endtabs %}
129+
130+
## Дополнительные ресурсы
131+
132+
- Другие примеры "For comprehension" доступны [в книге Scala](/scala3/book/control-structures.html#for-expressions)

_tour/for-comprehensions.md

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,18 @@ num: 19
77
next-page: generic-classes
88
previous-page: extractor-objects
99

10-
redirect_from:
10+
redirect_from:
1111
- "/tutorials/tour/for-comprehensions.html"
1212
- "/tutorials/tour/sequence-comprehensions.html"
1313
---
1414

15-
Scala offers a lightweight notation for expressing *sequence comprehensions*. Comprehensions have the form `for (enumerators) yield e`, where `enumerators` refers to a semicolon-separated list of enumerators. An *enumerator* is either a generator which introduces new variables, or it is a filter. A comprehension evaluates the body `e` for each binding generated by the enumerators and returns a sequence of these values.
15+
Scala offers a lightweight notation for expressing _sequence comprehensions_. Comprehensions have the form `for (enumerators) yield e`, where `enumerators` refers to a semicolon-separated list of enumerators. An _enumerator_ is either a generator which introduces new variables, or it is a filter. A comprehension evaluates the body `e` for each binding generated by the enumerators and returns a sequence of these values.
1616

1717
Here's an example:
1818

1919
{% tabs for-comprehensions-01 class=tabs-scala-version %}
2020
{% tab 'Scala 2' for=for-comprehensions-01 %}
21+
2122
```scala mdoc
2223
case class User(name: String, age: Int)
2324

@@ -33,8 +34,10 @@ val twentySomethings =
3334

3435
twentySomethings.foreach(println) // prints Travis Dennis
3536
```
37+
3638
{% endtab %}
3739
{% tab 'Scala 3' for=for-comprehensions-01 %}
40+
3841
```scala
3942
case class User(name: String, age: Int)
4043

@@ -50,6 +53,7 @@ val twentySomethings =
5053

5154
twentySomethings.foreach(println) // prints Travis Dennis
5255
```
56+
5357
{% endtab %}
5458
{% endtabs %}
5559

@@ -59,6 +63,7 @@ Here is a more complicated example using two generators. It computes all pairs o
5963

6064
{% tabs for-comprehensions-02 class=tabs-scala-version %}
6165
{% tab 'Scala 2' for=for-comprehensions-02 %}
66+
6267
```scala mdoc
6368
def foo(n: Int, v: Int) =
6469
for (i <- 0 until n;
@@ -73,6 +78,7 @@ foo(10, 10).foreach {
7378

7479
{% endtab %}
7580
{% tab 'Scala 3' for=for-comprehensions-02 %}
81+
7682
```scala
7783
def foo(n: Int, v: Int) =
7884
for i <- 0 until n
@@ -83,10 +89,12 @@ foo(10, 10).foreach {
8389
(i, j) => println(s"($i, $j) ") // prints (1, 9) (2, 8) (3, 7) (4, 6) (5, 5) (6, 4) (7, 3) (8, 2) (9, 1)
8490
}
8591
```
92+
8693
{% endtab %}
8794
{% endtabs %}
8895

8996
Here `n == 10` and `v == 10`. On the first iteration, `i == 0` and `j == 0` so `i + j != v` and therefore nothing is yielded. `j` gets incremented 9 more times before `i` gets incremented to `1`. Without the `if` guard, this would simply print the following:
97+
9098
```scala
9199
(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (0, 5) (0, 6) (0, 7) (0, 8) (0, 9) (1, 0) ...
92100
```
@@ -97,6 +105,7 @@ You can omit `yield` in a comprehension. In that case, comprehension will return
97105

98106
{% tabs for-comprehensions-03 class=tabs-scala-version %}
99107
{% tab 'Scala 2' for=for-comprehensions-03 %}
108+
100109
```scala mdoc:nest
101110
def foo(n: Int, v: Int) =
102111
for (i <- 0 until n;
@@ -105,9 +114,11 @@ def foo(n: Int, v: Int) =
105114

106115
foo(10, 10)
107116
```
117+
108118
{% endtab %}
109119

110120
{% tab 'Scala 3' for=for-comprehensions-03 %}
121+
111122
```scala
112123
def foo(n: Int, v: Int) =
113124
for i <- 0 until n
@@ -116,9 +127,10 @@ def foo(n: Int, v: Int) =
116127

117128
foo(10, 10)
118129
```
130+
119131
{% endtab %}
120132
{% endtabs %}
121133

122134
## More resources
123135

124-
* Other examples of "For comprehension" in the [Scala Book](/overviews/scala-book/for-expressions.html)
136+
- Other examples of "For comprehension" in the [Scala Book](/scala3/book/control-structures.html#for-expressions)

0 commit comments

Comments
 (0)