Замыкания
Анонимные функции
«Замыкания» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Что такое замыкание
Замыкание — это анонимная функция, которую можно сохранить в переменной и вызвать позже. Она записывается с вертикальными чертами вокруг параметров.
fn main() {
let add_one = |x| x + 1;
println!("{}", add_one(4));
}Синтаксис замыканий
Параметры записываются между |...|, за ними следует тело. Если тело состоит из одного выражения, фигурные скобки не нужны.
|x| x + 1— один параметр.|a, b| a + b— два параметра.
fn main() {
let multiply = |a, b| a * b;
println!("{}", multiply(3, 5));
}Многострочные замыкания
Если нужно выполнить несколько инструкций, заключите тело в фигурные скобки, как у функции.
fn main() {
let describe = |n: i32| {
let doubled = n * 2;
println!("{} doubled is {}", n, doubled);
};
describe(7);
}Захват окружения
В отличие от обычной функции, замыкание может захватывать переменные из окружающей области видимости и использовать их внутри.
fn main() {
let factor = 10;
let scale = |x| x * factor;
println!("{}", scale(5));
}Вывод типов в замыканиях
Замыкания обычно выводят типы параметров и возвращаемого значения по способу их использования, поэтому аннотации необязательны.
При необходимости можно добавить типы для ясности.
fn main() {
let greet = |name: &str| -> String {
format!("Hello, {}!", name)
};
println!("{}", greet("Rust"));
}Замыкания как аргументы
Многие стандартные методы принимают замыкание. Например, map применяет замыкание к каждому элементу.
fn main() {
let nums = vec![1, 2, 3];
let doubled: Vec<i32> = nums.iter().map(|x| x * 2).collect();
println!("{:?}", doubled);
}Фильтрация с помощью замыканий
Метод filter оставляет только те элементы, для которых замыкание возвращает значение true.
fn main() {
let nums = vec![1, 2, 3, 4, 5, 6];
let evens: Vec<i32> = nums.into_iter().filter(|x| x % 2 == 0).collect();
println!("{:?}", evens);
}Сохранение замыканий
У замыканий уникальные анонимные типы, но их можно сохранить в переменной и использовать повторно.
fn main() {
let is_even = |n: i32| n % 2 == 0;
println!("{} {}", is_even(4), is_even(7));
}Замыкания и функции
Различия:
- Функции не могут захватывать окружающие переменные, а замыкания могут.
- Замыкания анонимны и часто имеют небольшой размер.
- Типы замыканий обычно выводятся автоматически.
fn main() {
let base = 100;
let bonus = |earned: i32| earned + base;
println!("{}", bonus(25));
}Возврат вычисленных значений
Объединяйте замыкания с итераторами, чтобы получать результаты с помощью понятной и выразительной цепочки операций.
fn main() {
let nums = vec![10, 20, 30];
let total: i32 = nums.iter().map(|x| x + 1).sum();
println!("total {}", total);
}Замыкания захватывают по ссылке
По умолчанию замыкание заимствует захваченные переменные. После этого их всё ещё можно читать за пределами замыкания, если они только заимствованы.
fn main() {
let name = String::from("Ada");
let printer = || println!("Name: {}", name);
printer();
println!("still usable: {}", name);
}Быстрая проверка
Вспомните одну из ключевых возможностей замыканий.
Повторение
Замыкания в Rust:
- Анонимные функции, записываемые как
|params| body. - Могут захватывать переменные из своего окружения.
- Их типы обычно выводятся автоматически.
- Широко используются с методами итераторов, такими как
mapиfilter.
fn main() {
let tax = 0.2;
let with_tax = |price: f64| price * (1.0 + tax);
println!("{}", with_tax(50.0));
}Часто задаваемые вопросы
Урок «Замыкания» бесплатный?
Да — полный текст урока «Замыкания» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «Замыкания»?
Анонимные функции Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Замыкания»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.