Ранее вы уже использовали значения различных типов данных Rust. Это и числа (целые
и дробные), логические, текстовые и символьные. Мы использовали определенные к коде
значения, отправляя их, как входные параметры в макрос print
или println
.
Каждое значение мы могли использовать только в конкретном месте и не имели возможности
ссылаться каким-либо образом не него.
Для реализации этой цели вводится такое понятие, как переменная
. Переменной называют
пару - объект и его значение. Переменная может быть инициализированной и неинициализированной.
В коде программы для объявления переменной существует специальное слово (ключевое слово) - let
.
fn main() {
let number = 2;
let other_number = 3;
println!("{}", number + other_number);
let float_number = 2.;
let other_float_number = 3.;
println!("{}", float_number + other_float_number);
let character = '=';
let other_character = '!';
println!("{}{}", character, other_character);
let boolean_true = true;
let boolean_false = false;
println!(
"{} != {}. {}",
boolean_true,
boolean_false,
boolean_true != boolean_false
);
}
Обратите внимание, как происходит сохранение ссылки на конкретное значение:
- выделяется достаточно памяти для хранение значения,
- в эту память сохраняется конкретное значение,
- эта ячейка памяти именуется и может быть использована в коде программы.
Рассмотрим пример использования переменной в макросе println
:
fn main() {
let number = 2;
let other_number = 3;
println!("{}", number + 3);
println!("{}, {}", other_number, 3);
}
Продолжим изучать переменные. Для того чтобы иметь возможность вносить изменение в содержание переменной, при её объявлении необходимо сообщить о этом компилятору. С помощью ключевого mut
при объявлении переменной мы указывает, что эта переменная
в коде программы может хранить различные значения. Тип хранимой переменной определяется или явным образом или неявно, при помощи
типа данных при её инициализации.
fn main() {
let mut number = 2;
print!("{}", number);
number = 3;
print!(" {}", number);
//number = true;
//number = 'a';
//number = "'a'";
}
При увеличении значения переменной на какое-то значение в Rust можно использовать сокращенную запись. Две следующие записи эквивалеентны:
fn main() {
let mut variable_1 = 1;
let mut variable_2 = 1;
variable_1 = variable_1 + 1;
variable_2 += 1;
println!("variable_1 = {}", variable_1);
println!("variable_2 = {}", variable_2);
}
В Rust есть возможность использовать одно имя для различных преременных внутри одной области видимости. Благодаря этой возможности можно временно прекратить использовать переменную одного типа данных и пользоваться другой или использовать разные значения.
fn main() {
let mut n = 1;
print!("{}", n);
n = 2;
print!(" {}", n);
{
let n = 3.14;
print!(" {}", n);
}
print!(" {}", n);
}
Обратите внимание на вложенный скобки - это блок, в котором есть своя зона видимости и все переменные, которые в ней определены прекращают своё действие после выхода программы из этого блока.
Изучите реакцию компилятора, раскомментировав код. Замените числовые значения символьными, логическими, текстовыми. Посмотрите на результат.
Изучим поведение и рекомендации компилятора при попытках сломать рабочий код. Если мы укажем ключевое слово mut
но в коде программы не будем изменять содержание переменной - при компиляции будет предупреждение.
fn main() {
let mut number = 2;
print!("{}", number);
}
Если мы вообще не укажем значение при объявлении переменной, но попытаемся использовать её - будет ошибка компиляции.
fn main() {
let mut number;
print!("{}", number);
}
Если мы вообще не используем переменную - компилятор также это выявит и предложит вообще отказаться от её инициализации либо
сообщить в коде программы, что данную переменную можно игнорировать. Для этого перед именем переменной нужно указать специальный
символ _
.
fn main() {
let _number= 2;
//print!("{}", number);
}
Кроме того, данный символ является зарезервированным это значит, что его применение ограничено синтаксисом языка.
Язык Rust весьма минималистичен. Дополнительные возможности его использования, примеры хорошего стиля программировния расскрываются в стандартной библиотеке, которая присутствует по умолчанию при установке. Рассмотрим одну важну функцию, которая пригодится каждому исследователю языковых возможностей - это определение длинны (своеобразный "лабораторный инструмент") - функция определения длинны.
Вот вариант её использования:
fn main() {
println!("{} {}", str::len("abcde"), "abcde".len());
//println!("{} {}", str::len('a'), 'a'.len());
//println!("{} {}", str::len(1.), 1..len());
//println!("{} {}", str::len(1.), 1..len());
//println!("{} {}", str::len(true), false.len());
}
Rust Playground Раскомментировав строчки кода, из сообщений компилятора вы узнаете об ограничениях работы функций. Обратите также внимание на синтаксис вызова функий разных видов.
Попрактикуйтесь в использование объявления переменных. Используйте различные типы данных. Ломайте код, делайте ошибки, читайте сообщения компилятора.