Logo

Developer learning path

Rust

Замыкания в Rust

Замыкания

4

#description

Замыкания - это функции, которые могут захватывать переменные из своего окружения. В Rust замыкания реализованы как тип данных типа Fn, FnMut и FnOnce.

Fn - замыкание, которое берет ссылку на захваченные переменные по значению. Такое замыкание не может менять значения переменных, которые оно захватывает.

FnMut - замыкание, которое берет ссылку на захваченные переменные по изменяемой ссылке (&mut). Такое замыкание может менять значения переменных, которые оно захватывает.

FnOnce - замыкание, которое берет захваченные переменные по значению, но забирает их в собственность. Такое замыкание может быть вызвано только один раз.

Пример использования замыкания типа Fn:

                    
fn main() {
    let x = 5;

    let add_five = |y| x + y;

    let result = add_five(3);

    println!("Result: {}", result); // Output: Result: 8
}
                  

В данном примере переменная x захватывается замыканием add_five и используется вместе с аргументом y для вычисления результата.

Пример использования замыкания типа FnMut:

                    
fn main() {
    let mut x = 5;

    let mut add_five = |y| x += y;

    add_five(3);

    println!("Result: {}", x); // Output: Result: 8
}
                  

В данном примере переменная x захватывается замыканием add_five по изменяемой ссылке и изменяется внутри замыкания.

Пример использования замыкания типа FnOnce:

                    
fn main() {
    let x = vec![1, 2, 3];

    let consume_vec = move || {
        for i in x {
            println!("{}", i);
        }
    };

    consume_vec(); // Output: 1 2 3
    
    // Замыкание уже потребило владение переменной x,
    // поэтому дальнейшее использование её вызовет ошибку компиляции
    // consume_vec();
}
                  

В данном примере переменная x захватывается замыканием consume_vec и используется внутри замыкания для печати её значений. Замыкание типа FnOnce забирает переменную x в собственность, поэтому дальнейшее использование переменной вызовет ошибку компиляции.

March 27, 2023

Если вам не совсем понятен какой-то абзац текста из лекции, просто нажмите на него и сможете задать уточняющие вопросы по нему.

Если же непонятен весь вопрос, то нажмите на кнопки внизу, чтобы получить новый вариант объяснения, практические примеры или критически оценить сам вопрос.