Skip to content

Russian Tour full #1263

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Feb 8, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
👌 Updating for-comprehensions and generic-classes.
Took 1 hour 9 minutes
  • Loading branch information
kotobotov committed Feb 1, 2019
commit 496cac96a2c2ff01966102fb945d46edadf46553
10 changes: 5 additions & 5 deletions _ru/tour/for-comprehensions.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
layout: tour
title: Представление вида For
title: Сложные for-выражения

discourse: true

Expand All @@ -13,7 +13,7 @@ previous-page: extractor-objects

---

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

Вот пример:

Expand All @@ -30,7 +30,7 @@ val twentySomethings = for (user <- userBase if (user.age >=20 && user.age < 30)

twentySomethings.foreach(name => println(name)) // выводит "Travis Dennis"
```
Представление `for`, используется с оператором `yield`, на самом деле создает `List`. Потому что мы указали `yield user.name` (то есть вывести имя пользователя), получаем `List[String]`. `user <- userBase` и есть наш генератор, а `if (user.age >=20 && user.age < 30)` - это фильтр который отфильтровывает пользователей, не достигших 20-летнего возраста.
`for`-выражение, используется с оператором `yield`, на самом деле создает `List`. Потому что мы указали `yield user.name` (то есть вывести имя пользователя), получаем `List[String]`. `user <- userBase` и есть наш генератор, а `if (user.age >=20 && user.age < 30)` - это фильтр который отфильтровывает пользователей, не достигших 20-летнего возраста.

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

Expand All @@ -52,9 +52,9 @@ foo(10, 10) foreach {
(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (0, 5) (0, 6) (0, 7) (0, 8) (0, 9) (1, 1) ...
```

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

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

```tut
def foo(n: Int, v: Int) =
Expand Down
6 changes: 3 additions & 3 deletions _ru/tour/generic-classes.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ previous-page: for-comprehensions
assumed-knowledge: classes unified-types

---
Обобще��ные классы - это классы, которые принимают тип в качестве параметра. Они особенно полезны для создания коллекций классов.
Обобщенные классы (Generic classes) - это классы, обладающие параметрическим полиморфизмом (т. е. классы, которые изменяют свое поведение в зависимости от приписываемого им типа. Этот тип указывается в квадратных скобках `[]` сразу после имени класса). Они особенно полезны для создания коллекций.

## Объявление обобщенного класса
Обобщенные классы принимают тип в качестве параметра в квадратных скобках `[]`. По соглашению обычно используют буквы `A` в качестве имени параметра типа, хотя можно использовать любое имя.
Для объявления обобщенного класса необходимо после имени добавить еще один параметр "тип класса" в квадратных скобках `[]`. По соглашению обычно используют заглавные буквы `A` в качестве указания, на новый параметр "тип класса", хотя можно использовать любое имя.
```tut
class Stack[A] {
private var elements: List[A] = Nil
Expand All @@ -33,7 +33,7 @@ class Stack[A] {

## Использование

Чтобы использовать обобщенный класс, поместите тип в квадратные скобки вместо `A`.
Чтобы использовать обобщенный класс, поместите конкретный тип в квадратные скобки вместо `A`.
```
val stack = new Stack[Int]
stack.push(1)
Expand Down