Rust на примерах — страница 12 из 65

Выражения

Программы на языке Rust - это (в основном) набор последовательных операторов:

fn main() {

// оператор

// оператор

// оператор

}

Существует несколько типов операторов в Rust. Наиболее распространённые - оператор связывания и выражение, заканчивающееся ;:

fn main() {

// оператор связывания

let x = 5;


// оператор выражения

x;

x + 1;

15;

}

Блоки так же могут быть частью оператора выражения. Они используются в качестве r-values при присваивании. Последнее выражение в блоке будет присвоено l-value. Однако, если последнее выражение в блоке оканчивается точкой с запятой, в качестве значения будет возвращено ().

fn main() {

let x = 5u32;

let y = {

let x_squared = x * x;

let x_cube = x_squared * x;

// Результат этого выражение будет присвоен переменной `y`

x_cube + x_squared + x

};

let z = {

// Т.к это выражение оканчивается на `;`, переменной `z` будет присвоен `()`

2 * x;

};

println!("x равен {:?}", x);

println!("y равен {:?}", y);

println!("z равен {:?}", z);

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Управление потоком

Неотъемлемой частью любого языка программирования является изменение потоков управления: if/else, for и другие. Давайте поговорим о них в языке Rust.

if/else

Ветвление с помощью if-else такое же, как и в других языка программирования. В отличие от многих других языков программирования, логические условия не должны быть заключены в круглые скобки и после каждого условия должен следовать блок. Условия if-else являются выражениями, и все ветки должны возвращать одинаковый тип данных.

fn main() {

let n = 5;

if n < 0 {

print!("{} — отрицательное", n);

} else if n > 0 {

print!("{} — положительное", n);

} else {

print!("{} — нуль", n);

}

let big_n =

if n < 10 && n > -10 {

println!(", малое по модулю число, умножим его в десять раз");

// Это выражение вернёт `i32`.

10 * n

} else {

println!(", большое по модулю число, уменьшим его вдвое");

// И это выражение вернёт `i32`.

n / 2

// ЗАДАНИЕ ^ Попробуйте отбросить значение, добавив точку с запятой.

};

//   ^ Не забудьте добавить тут точку с запятой! Все операторы `let` требуют её..

println!("{} -> {}", n, big_n);

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

loop

Rust предоставляет ключевое слово loop для обозначения бесконечного цикла.

Оператор break используется чтобы выйти из цикла в любое время, оператор continue используется чтобы пропустить оставшуюся часть цикла и начать новую итерацию.

fn main() {

let mut count = 0u32;

println!("Давайте считать до бесконечности!");

// Бесконечный цикл

loop {

count += 1;

if count == 3 {

println!("три");

// Пропустить оставшуюся часть цикла

continue;

}

println!("{}", count);

if count == 5 {

println!("Всё, достаточно");

// Выйти из цикла

break;

}

}

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Вложенность и метки

Можно прерывать выполнение внешних циклов с помощью break или continue, когда речь заходит о вложенных циклах. Для этого циклы должны быть обозначены метками вроде 'label, а метки должны быть переданы операторам break или continue.

#![allow(unreachable_code)]

fn main() {

'outer: loop {

println!("Вошли во внешний цикл");

'inner: loop {

println!("Вошли во внутренний цикл");

// Это прервёт лишь внутренний цикл

//break;

// Это прервёт внешний цикл

break 'outer;

}

println!("Эта точка не будет достигнута");

}

println!("Вышли из внешнего цикла");

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Возврат из циклов

Одним из видов использования цикла loop является повторение операции, пока она не будет выполнена. Если операция возвращает значение, вам может потребоваться передать его в другую часть кода: поместите его после break, и оно будет возвращено выражением loop.

fn main() {

let mut counter = 0;

let result = loop {

counter += 1;

if counter == 10 {

break counter * 2;

}