Выражения
Программы на языке 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;
}