Замыкания в Rust
Замыкания
4
Замыкания - это функции, которые могут захватывать переменные из своего окружения. В 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