Захват переменных
Замыкание может захватывать переменные из окружения, в котором оно определено.
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let max_value = 5;
let clamp = |v| {
if v > max_value { max_value } else { v }
};
dbg!(clamp(1));
dbg!(clamp(3));
dbg!(clamp(5));
dbg!(clamp(7));
dbg!(clamp(10));
}
-
По умолчанию замыкание захватывает значения по ссылке. Здесь
max_valueзахватываетсяclamp, но по-прежнему доступнаmainдля вывода. Попробуйте сделатьmax_valueизменяемой, изменить её и снова вывести ограниченные значения. Почему это не работает? -
Если замыкание изменяет значения, оно захватывает их по изменяемой ссылке. Попробуйте добавить
max_value += 1вclamp. -
Можно заставить замыкание перемещать значения вместо того, чтобы брать на них ссылки, с помощью ключевого слова
move. Это может помочь с временами жизни, например если замыкание должно пережить захваченные значения (подробнее о временах жизни позже).Выглядит это так:
move |v| ... Попробуйте добавить это ключевое слово и посмотрите, сможет лиmainпо-прежнему обращаться кmax_valueпосле определенияclamp. -
По умолчанию замыкания захватывают каждую переменную из внешней области видимости тем видом доступа, который требует наименьших прав (сначала по разделяемой ссылке, если возможно, затем по эксклюзивной ссылке, затем перемещением). Ключевое слово
moveзаставляет захват по значению.