Menu
Coddy logo textTech

Захват окружения

Часть раздела 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
challenge icon

Задание

Легко

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

Требования:

  • Прочитайте первое входное значение (базовую цену) и удалите лишние пробелы
  • Преобразуйте его в 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);
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow