Блоки и скоупы#
Итак, существует переменная со своей силой. Теперь представьте себе область видимости как некую территорию на которой эта переменная имеет силу. В Rust такая территория называется скоупом (Scope). В этой статье мы поговорим о том, что такое скоуп/блоки и как это всё работает.
Блок (Block) - это область между открытыми и закрытыми фигурными скобками. Каждый раз, когда вы пишете фигурные скобки, например после названия функции:
вы создаете новый блок 1 . Все, что находится внутри этого блока 2 считается его областью видимости.
Пример:
Создадим переменную для хранения значения срабатывания датчика движения от 0 до 100%
fn main(){
3
let move_sensor = 10;
}
Теперь зададим себе вопрос: в какой области эта переменная доступна? Ответом будет: область видимости переменной move_sensor - главная функция 3
(main)
.
Стало чуть понятнее? Хорошо тогда движемся дальше.
Вложенные скоупы#
Что если мы хотим создать новый скоуп внутри функции main
? Мы можем сделать это используя фигурные скобки:
fn main(){
let move_sensor = 10;
{
4
}
}
Мы создали новый блок - вложенная область видимости или вложенный контекст 4 если сказать иначе.
Взаимодействие между скоупами#
Как я уже упоминал в прошлой статье про затенение, внутренний скоуп может захватывать переменные из внешнего скоупа. Но в обратную сторону это не сработает. Вы не сможете объявить в внутреннем скоупе переменную и использовать её вне его границ.
fn main(){
{
let light_sensor = 20;
println!("Value of light sensor is {light_sensor}");
}
5
println!("Value of light sensor is {light_sensor}"); // ERROR!!!
}
Ошибка - cannot find value 'light_sensor' in this scope
.
Все! переменная датчика света не существует дальше границ блока где она была объявлена 5 .
Вывод#
Вложенный скоуп можно представить как некий портал в который вы можете что-то принести, но вынести из него ничего нельзя. ✨
Важно запомнить, что:
- Переменные существуют внутри скоупа, в котором они объявлены.
- Внутренний скоуп может захватывать переменные из внешнего скоупа.
- Вы не можете использовать переменную вне ее скоупа.
Теперь вы знаете как правильно “готовить” области видимости в Rust! 😉