Захват окружения
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 62 из 66.
Одной из самых мощных особенностей замыканий является их способность захватывать и использовать переменные из окружающей среды. В отличие от обычных функций, замыкания могут «видеть» и получать доступ к переменным, которые существуют в той же области видимости, где они определены.
Вот как работает захват окружения:
fn main() {
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // Это выведет "The value of x is: 10"
}В этом примере замыкание захватывает переменную x из окружающей области видимости и использует её внутри своего тела. Замыканию не нужно, чтобы x передавалась в качестве параметра — оно автоматически имеет к ней доступ.
Вы также можете захватывать переменные и использовать их в вычислениях:
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // результат — 15Задание
ЛегкоВы получите два входных значения. Первое значение — это число, представляющее базовую цену. Второе значение — это число, представляющее процент скидки. Создайте замыкание, которое захватывает процент скидки из окружения и вычисляет окончательную цену после применения скидки. Вызовите замыкание с базовой ценой и выведите окончательную цену.
Требования:
- Прочитайте первое входное значение (базовую цену) и удалите лишние пробелы
- Преобразуйте его в
f64 - Прочитайте второе входное значение (процент скидки) и удалите лишние пробелы
- Преобразуйте его в
f64 - Создайте замыкание, которое принимает один параметр (базовую цену) и захватывает процент скидки из окружающего контекста
- Замыкание должно вычислять окончательную цену по формуле:
base_price - (base_price * discount / 100.0) - Вызовите замыкание с базовой ценой
- Выведите окончательную цену
Ввод:
- Первая строка: Базовая цена (например,
100.0) - Вторая строка: Процент скидки (например,
20.0)
Вывод:
- Окончательная цена после применения скидки
Шпаргалка
Замыкания могут захватывать и использовать переменные из своего окружения, не требуя их в качестве параметров.
Базовый захват окружения:
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // Выводит "The value of x is: 10"Захват переменных в вычислениях:
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // result равен 15Замыкание автоматически захватывает multiplier из окружающей области видимости и использует его в вычислении.
Попробуйте сами
use std::io;
fn main() {
// Считать базовую цену
let mut base_price_input = String::new();
io::stdin().read_line(&mut base_price_input).expect("Failed to read line");
let base_price: f64 = base_price_input.trim().parse().expect("Invalid number");
// Считать процент скидки
let mut discount_input = String::new();
io::stdin().read_line(&mut discount_input).expect("Failed to read line");
let discount: f64 = discount_input.trim().parse().expect("Invalid number");
// TODO: Создать замыкание, которое захватывает скидку и вычисляет итоговую цену
// TODO: Вызвать замыкание с базовой ценой
// Вывести итоговую цену
// println!("{}", final_price);
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутое управление потоком выполнения
Выражение 'match'Сопоставление нескольких значенийСопоставление диапазоновВыражение 'if let'Циклы как выраженияИтоги — Простой парсер команд4Группировка данных с помощью структур
Что такое структура?Обзор структурДоступ к полям структурыИзменяемые структурыСтруктуры как параметры функцийКортежные структурыИтоги: создание структуры Book7Обработка ошибок с помощью 'Result'
Что такое 'Result'?Использование 'match' с 'Result'is_ok() и is_err()Сокращения: unwrap и expectОператор вопросительного знака '?'Парсинг строк в числаИтоги: функция безопасного деления10Замыкания и анонимные функции
Что такое замыкание?Определение простого замыканияЗамыкания с параметрамиЗахват окруженияИтоги: Простое замыкание-сумматор2Введение в векторы
Что такое вектор?Создание вектораДобавление элементов с помощью pushДоступ к элементам вектораИтерация по векторуИзменяемая итерацияУдаление элементовИтоги — Простой счетчик очков5Пары «ключ-значение» в Hash Map
Что такое Hash Map?Создание Hash MapВставка пар «ключ-значение»Доступ к значениямИтерация по Hash MapОбновление значенияУдаление парыИтоги — Счетчик слов8Проект: Простой инвентарь товаров
Настройка проектаДобавление товараПроверка наличияПродажа товараСобираем всё воедино3Список дел в командной строке
Настройка проектаДобавление задачиПросмотр всех задачУдаление задачиИтоговый код6Обработка отсутствия значения с 'Option'
Что такое 'Option'?Использование 'match' с 'Option'is_some() и is_none()Распаковка 'Option'Метод expectЗначение по умолчанию: unwrap_orИтоги: поиск элемента