Skip to content

Latest commit

 

History

History
179 lines (139 loc) · 9.64 KB

ch-03-variables.md

File metadata and controls

179 lines (139 loc) · 9.64 KB

Переменные

Объявление

Ранее вы уже использовали значения различных типов данных 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
    );
}

Rust Playground

Обратите внимание, как происходит сохранение ссылки на конкретное значение:

  • выделяется достаточно памяти для хранение значения,
  • в эту память сохраняется конкретное значение,
  • эта ячейка памяти именуется и может быть использована в коде программы.

Рассмотрим пример использования переменной в макросе println:

fn main() {
    let number = 2;
    let other_number = 3;
    println!("{}", number + 3);
    println!("{}, {}", other_number, 3);
}

Rust Playground

Изменяемая переменная

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

fn main() {
    let mut number = 2;
    print!("{}", number);
    number = 3;
    print!(" {}", number);
    //number = true;
    //number = 'a';
    //number = "'a'";
}

Rust Playground

Сокращенная запись арифметических операций

При увеличении значения переменной на какое-то значение в 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 Playground

Скрытие переменной

В Rust есть возможность использовать одно имя для различных преременных внутри одной области видимости. Благодаря этой возможности можно временно прекратить использовать переменную одного типа данных и пользоваться другой или использовать разные значения.

fn main() {
    let mut n = 1;
    print!("{}", n);
    n = 2;
    print!(" {}", n);
    {
        let n = 3.14;
        print!(" {}", n);
    }
    print!(" {}", n);
}

Rust Playground

Обратите внимание на вложенный скобки - это блок, в котором есть своя зона видимости и все переменные, которые в ней определены прекращают своё действие после выхода программы из этого блока.

Домашнее задание

Изучите реакцию компилятора, раскомментировав код. Замените числовые значения символьными, логическими, текстовыми. Посмотрите на результат.

Наш помощник - компилятор

Изучим поведение и рекомендации компилятора при попытках сломать рабочий код. Если мы укажем ключевое слово mut но в коде программы не будем изменять содержание переменной - при компиляции будет предупреждение.

fn main() {
    let mut number = 2;
    print!("{}", number);
}

Rust Playground

Если мы вообще не укажем значение при объявлении переменной, но попытаемся использовать её - будет ошибка компиляции.

fn main() {
    let mut number;
    print!("{}", number);
}

Rust Playground

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

fn main() {
    let _number= 2;
    //print!("{}", number);
}

Rust Playground

Кроме того, данный символ является зарезервированным это значит, что его применение ограничено синтаксисом языка.

Стандартная библиотека Rust - тоже хороший помощник

Язык 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 Раскомментировав строчки кода, из сообщений компилятора вы узнаете об ограничениях работы функций. Обратите также внимание на синтаксис вызова функий разных видов.

Домашнее задание

Попрактикуйтесь в использование объявления переменных. Используйте различные типы данных. Ломайте код, делайте ошибки, читайте сообщения компилятора.