Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Захват переменных

Замыкание может захватывать переменные из окружения, в котором оно определено.

// 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));
}
This slide should take about 5 minutes.
  • По умолчанию замыкание захватывает значения по ссылке. Здесь max_value захватывается clamp, но по-прежнему доступна main для вывода. Попробуйте сделать max_value изменяемой, изменить её и снова вывести ограниченные значения. Почему это не работает?

  • Если замыкание изменяет значения, оно захватывает их по изменяемой ссылке. Попробуйте добавить max_value += 1 в clamp.

  • Можно заставить замыкание перемещать значения вместо того, чтобы брать на них ссылки, с помощью ключевого слова move. Это может помочь с временами жизни, например если замыкание должно пережить захваченные значения (подробнее о временах жизни позже).

    Выглядит это так: move |v| ... Попробуйте добавить это ключевое слово и посмотрите, сможет ли main по-прежнему обращаться к max_value после определения clamp.

  • По умолчанию замыкания захватывают каждую переменную из внешней области видимости тем видом доступа, который требует наименьших прав (сначала по разделяемой ссылке, если возможно, затем по эксклюзивной ссылке, затем перемещением). Ключевое слово move заставляет захват по значению.