Skip to content

Commit

Permalink
Translate ch03-03-how-functions-work.md via GitLocalize
Browse files Browse the repository at this point in the history
  • Loading branch information
dluschan authored and gitlocalize-app[bot] committed Sep 22, 2023
1 parent 89b7906 commit 3703e65
Showing 1 changed file with 13 additions and 13 deletions.
26 changes: 13 additions & 13 deletions rustbook-ru/src/ch03-03-how-functions-work.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,26 +62,26 @@

Поскольку мы вызвали функцию с `5` в качестве значения для `value` и `'h'` в качестве значения для `unit_label`, вывод программы содержит эти значения.

### Операторы и выражения
### Инструкции и выражения

Тела функций состоят из ряда операторов, необязательно заканчивающихся выражением. До сих пор функции, которые мы рассматривали, не включали завершающее выражение, но вы видели выражение как часть оператора. Поскольку Rust является языком, основанным на выражениях, это важное различие необходимо понимать. В других языках таких различий нет, поэтому давайте рассмотрим, что такое операторы и выражения, и как их различия влияют на тела функций.
Тела функций состоят из ряда инструкций, необязательно заканчивающихся выражением. До сих пор функции, которые мы рассматривали, не включали завершающее выражение, но вы видели выражение как часть инструкции. Поскольку Rust является языком, основанным на выражениях, это важное различие необходимо понимать. В других языках таких различий нет, поэтому давайте рассмотрим, что такое инструкции и выражения, и как их различия влияют на тела функций.

- **Операторы** — это инструкции, которые выполняют какое-либо действие и не возвращают значения.
- **Инструкции** выполняют какое-либо действие и не возвращают значения.
- **Выражения** вычисляются до результирующего значения. Давайте рассмотрим несколько примеров.

На самом деле мы уже использовали операторы и выражения. Создание переменной и присвоение ей значения с помощью ключевого слова `let` является оператором. В Листинге 3-1, `let y = 6;` - это оператор.
На самом деле мы уже использовали инструкции и выражения. Создание переменной и присвоение ей значения с помощью ключевого слова `let` является оператором. В Листинге 3-1, `let y = 6;` это инструкция.

<span class="filename">Имя файла: src/main.rs</span>

```rust
{{#rustdoc_include ../listings/ch03-common-programming-concepts/listing-03-01/src/main.rs}}
```

<span class="caption">Листинг 3-1: Объявление функции <code>main</code>, содержащей один оператор</span>
<span class="caption">Листинг 3-1: Объявление функции <code>main</code>, содержащей одну инструкцию</span>

Определения функций также являются операторами. Весь предыдущий пример сам по себе является оператором.
Определения функций также являются инструкцией. Весь предыдущий пример сам по себе является инструкцией.

Поэтому нельзя присвоить значение оператора `let` другой переменной, как это сделано в следующем коде. Вы получите ошибку:
Инструкции не возвращают значения. Следовательно вы не можете присвоить `let` инструкцию другой переменной, как это пытается сделать следующий код. Вы получите ошибку:

<span class="filename">Имя файла: src/main.rs</span>

Expand All @@ -95,9 +95,9 @@
{{#include ../listings/ch03-common-programming-concepts/no-listing-19-statements-vs-expressions/output.txt}}
```

Оператор `let y = 6` не возвращает значение, поэтому не с чем связать переменную `x`. Это отличается от поведения в других языках, таких как C и Ruby, где операция присваивания возвращает значение присваивания. В таких языках можно писать код `x = y = 6` и обе переменные `x` и `y` будут иметь одинаковое значение `6`. Но в Rust не так.
Инструкция `let y = 6` не возвращает значение, поэтому не с чем связать переменную `x`. Это отличается от поведения в других языках, таких как C и Ruby, где присваивание возвращает присвоенное значение. В таких языках можно писать код `x = y = 6` и обе переменные `x` и `y` будут иметь значение `6`. Но в Rust не так.

Выражения вычисляют значение и составляют большую часть остального кода, который вы напишете на Rust. Рассмотрим математическую операцию, к примеру `5 + 6`, которая является выражением, вычисляющим значение `11`. Выражения могут быть частью операторов: в листинге 3-1 `6` в операторе `let y = 6;` является выражением, которое вычисляется в значение `6`. Вызов функции - это выражение. Вызов макроса - это выражение. Новый блок области видимости, созданный с помощью фигурных скобок, представляет собой выражение, например:
Выражения вычисляют значение и составляют большую часть остального кода, который вы напишете на Rust. Рассмотрим математическую операцию, к примеру `5 + 6`, которая является выражением, вычисляющим значение `11`. Выражения могут быть частью инструкций: в листинге 3-1 `6` в инструкции `let y = 6;` является выражением, которое вычисляется в значение `6`. Вызов функции это выражение. Вызов макроса это выражение. Новый блок области видимости, созданный с помощью фигурных скобок, представляет собой выражение, например:

<span class="filename">Имя файла: src/main.rs</span>

Expand All @@ -114,7 +114,7 @@
}
```

это блок, который в данном случае вычисляется в значение `4`. Это значение связывается с `y` как часть оператора `let`. Обратите внимание, что строка `x + 1` не имеет точки с запятой в конце, что отличается от большинства строк, которые вы видели до сих пор. Выражения не содержат завершающих точек с запятой. Если вы добавите точку с запятой в конец выражения, вы превратите его в оператор, и тогда оно не будет возвращать значение. Помните об этом, когда будете изучать возвращаемые значения функций и выражения.
это блок, который в данном случае вычисляется в значение `4`. Это значение связывается с `y` как часть инструкции `let`. Обратите внимание, что строка `x + 1` не имеет точки с запятой в конце, что отличается от большинства строк, которые вы видели до сих пор. Выражения не содержат завершающих точек с запятой. Если вы добавите точку с запятой в конец выражения, вы превратите его в инструкцию, и тогда она не будет возвращать значение. Помните об этом, когда будете изучать возвращаемые значения функций и выражения.

### Функции с возвращаемыми значениями

Expand All @@ -126,7 +126,7 @@
{{#rustdoc_include ../listings/ch03-common-programming-concepts/no-listing-21-function-return-values/src/main.rs}}
```

В коде функции `five` нет вызовов функций, макросов или даже операторов `let` - есть только одно число `5`. Это является абсолютно корректной функцией в Rust. Заметьте, что возвращаемый тип у данной функции определён как `-> i32`. Попробуйте запустить этот код. Вывод будет таким:
В коде функции `five` нет вызовов функций, макросов или даже инструкций `let` есть только одно число `5`. Это является абсолютно корректной функцией в Rust. Заметьте, что возвращаемый тип у данной функции определён как `-> i32`. Попробуйте запустить этот код. Вывод будет таким:

```console
{{#include ../listings/ch03-common-programming-concepts/no-listing-21-function-return-values/output.txt}}
Expand All @@ -148,7 +148,7 @@ let x = 5;
{{#rustdoc_include ../listings/ch03-common-programming-concepts/no-listing-22-function-parameter-and-return/src/main.rs}}
```

Запуск кода напечатает `The value of x is: 6`. Но если поставить точку с запятой в конце строки, содержащей `x + 1`, превратив её из выражения в оператор, мы получим ошибку:
Запуск кода напечатает `The value of x is: 6`. Но если поставить точку с запятой в конце строки, содержащей `x + 1`, превратив её из выражения в инструкцию, мы получим ошибку:

<span class="filename">Имя файла: src/main.rs</span>

Expand All @@ -162,4 +162,4 @@ let x = 5;
{{#include ../listings/ch03-common-programming-concepts/no-listing-23-statements-dont-return-values/output.txt}}
```

Основное сообщение об ошибке, `несовпадение типов`, раскрывает ключевую проблему этого кода. Определение функции `plus_one` сообщает, что будет возвращено `i32`, но операторы не вычисляют значение, что и выражается единичным типом `()`. Следовательно, ничего не возвращается, что противоречит определению функции и приводит к ошибке. В этом выводе Rust выдаёт сообщение, которое, возможно, поможет исправить эту проблему: он предлагает удалить точку с запятой для устранения ошибки.
Основное сообщение об ошибке, `несовпадение типов`, раскрывает ключевую проблему этого кода. Определение функции `plus_one` сообщает, что будет возвращено `i32`, но инструкции не вычисляются в значение, что и выражается единичным типом `()`. Следовательно, ничего не возвращается, что противоречит определению функции и приводит к ошибке. В этом выводе Rust выдаёт сообщение, которое, возможно, поможет исправить эту проблему: он предлагает удалить точку с запятой для устранения ошибки.

0 comments on commit 3703e65

Please sign in to comment.