Замыкания с параметрами
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 61 из 66.
Хотя замыкания, не принимающие параметров, полезны, в большинстве случаев вы захотите передавать данные в свои замыкания, чтобы сделать их более гибкими и мощными. Добавление параметров в замыкания следует тому же шаблону, который вы изучили ранее, но со значениями внутри вертикальных черт.
Вот как определяется замыкание, принимающее один параметр:
let add_one = |x: i32| x + 1;Обратите внимание, что параметр x располагается между вертикальными чертами, точно так же, как параметры функции. Затем вы можете вызвать это замыкание, передав значение:
let add_one = |x: i32| x + 1;
let result = add_one(5); // результат равен 6Для замыканий с несколькими параметрами разделяйте их запятыми:
let multiply = |x: i32, y: i32| x * y;
let result = multiply(3, 4); // результат равен 12Задание
ЛегкоВы получите два входных значения. Первое число — это основание, а второе — показатель степени. Создайте замыкание, которое принимает два параметра и вычисляет степень (первый параметр, возведенный в степень второго параметра). Сохраните замыкание в переменной, вызовите его с входными значениями и выведите результат.
Требования:
- Прочитайте первое входное значение (основание) и удалите лишние пробелы
- Преобразуйте его в тип
i32 - Прочитайте второе входное значение (показатель степени) и удалите лишние пробелы
- Преобразуйте его в тип
u32 - Создайте замыкание с двумя параметрами, которое вычисляет степень, используя метод
.pow() - Сохраните замыкание в переменной
- Вызовите замыкание с обоими входными значениями
- Выведите результат
Ввод:
- Первая строка: Число-основание (например,
2) - Вторая строка: Число-показатель степени (например,
3)
Вывод:
- Результат вычисления степени
Шпаргалка
Замыкания могут принимать параметры, если поместить их между вертикальными чертами ||:
let add_one = |x: i32| x + 1;
let result = add_one(5); // результат равен 6Для нескольких параметров разделяйте их запятыми:
let multiply = |x: i32, y: i32| x * y;
let result = multiply(3, 4); // результат равен 12Попробуйте сами
use std::io;
fn main() {
// Считать первый ввод (основание степени)
let mut base_input = String::new();
io::stdin().read_line(&mut base_input).expect("Failed to read line");
let base: i32 = base_input.trim().parse().expect("Invalid number");
// Считать второй ввод (показатель степени)
let mut exp_input = String::new();
io::stdin().read_line(&mut exp_input).expect("Failed to read line");
let exponent: u32 = exp_input.trim().parse().expect("Invalid number");
// TODO: Создать замыкание, которое вычисляет степень, и сохранить его в переменной
// TODO: Вызвать замыкание с основанием и показателем степени
// Вывести результат
println!("{}", result);
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела 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Итоги: поиск элемента