Перейти к основному содержимому
  1. Rust/

Области видимости и время жизни переменных в Rust

·480 слов·3 минуты· loading · loading · · ·Rust-basic
О Rust - Эта статья часть цикла.
Статей прочитано 0/38
0%
📚 Введение и дополнительные материалы
🟢 Начальный уровень (Rust-basic)
09 Области видимости и время жизни переменных в Rust (текущая)
Не прочитана
Не прочитана
🔵 Средний уровень (Rust-middle)

Блоки и скоупы
#

Подключим воображение чтобы лучше понять эту тему.

Итак, существует переменная со своей силой. Теперь представьте себе область видимости как некую территорию на которой эта переменная имеет силу. В Rust такая территория называется скоупом (Scope). В этой статье мы поговорим о том, что такое скоуп/блоки и как это всё работает.

Блок (Block) - это область между открытыми и закрытыми фигурными скобками. Каждый раз, когда вы пишете фигурные скобки, например после названия функции:

fn hello() { 
    1

   
       2
   
}

вы создаете новый блок 1 . Все, что находится внутри этого блока 2 считается его областью видимости.

Пример:

Создадим переменную для хранения значения срабатывания датчика движения от 0 до 100%

fn main(){ 
    3

    let move_sensor = 10;
}

Теперь зададим себе вопрос: в какой области эта переменная доступна? Ответом будет: область видимости переменной move_sensor - главная функция 3 (main).

Стало чуть понятнее? Хорошо тогда движемся дальше.

Вложенные скоупы
#

Что если мы хотим создать новый скоуп внутри функции main? Мы можем сделать это используя фигурные скобки:

fn main(){
    let move_sensor = 10;
    {
        
            4
        
    }
}

Мы создали новый блок - вложенная область видимости или вложенный контекст 4 если сказать иначе.

Взаимодействие между скоупами
#

Как я уже упоминал в прошлой статье про затенение, внутренний скоуп может захватывать переменные из внешнего скоупа. Но в обратную сторону это не сработает. Вы не сможете объявить во внутреннем скоупе переменную и использовать её вне его границ.

Области видимости и скоупы в Rust
Шаг 1/2
1// ?compile_fail
2fn main() {
3    {
4        let light_sensor = 20;
5        println!("Внутри блока (light): {}", light_sensor);
6    }
7    // ❌ Ошибка компиляции: light_sensor больше не существует!
8    println!("Вне блока (light): {}", light_sensor);
9}

Выход за границы области видимости

  • Переменная light_sensor объявлена внутри вложенного блока {}.
  • За границами этого блока переменная уничтожается (освобождается память).
  • Обращение к ней вне блока приводит к ошибке компиляции E0425.

При попытке использовать light_sensor за пределами фигурных скобок (как показано на Шаге 1) компилятор выдает ошибку cannot find value 'light_sensor' in this scope, потому что время жизни этой переменной закончилось на закрывающей фигурной скобке.

Вывод
#

Вложенный скоуп можно представить как некий портал в который вы можете что-то принести, но вынести из него ничего нельзя. ✨

Важно запомнить, что:

  • Переменные существуют внутри скоупа, в котором они объявлены.
  • Внутренний скоуп может захватывать переменные из внешнего скоупа.
  • Вы не можете использовать переменную вне ее скоупа.

Теперь вы знаете как правильно “готовить” области видимости в Rust! 😉


История обновлений

  • Добавил примеры с кодом для демонстрации областей видимости (scopes) переменных.
Статья прочитана
Пожалуйста, оцените насколько статья была вам полезна и понятна
Цикл статей
О Rust - Эта статья часть цикла.
Статей прочитано 0/38
0%
📚 Введение и дополнительные материалы
🟢 Начальный уровень (Rust-basic)
09 Области видимости и время жизни переменных в Rust (текущая)
Не прочитана
Не прочитана
🔵 Средний уровень (Rust-middle)

Связанные статьи