Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpFtMv 124 of 288 menu
◀ ▶

Захват во владение в Rust

Ключевое слово move перед телом замыкания забирает захваченные значения во владение. От того, копируемый это тип или владение строкой, зависит, какой трейт функции получится у замыкания.

Скопируем число во владение замыкания и передадим его в функцию с повторными вызовами:

fn apply(f: impl Fn(i32) -> i32, n: i32) -> i32 { f(n) } fn main() { let base = 10; let add_base = move |x| x + base; let first = apply(add_base, 1); let second = apply(add_base, 2); println!("{} {}", first, second); }

Число base копируется при захвате, поэтому замыкание add_base по-прежнему допускает много обращений. После move имя base снаружи еще можно читать, если тип копируемый.

Если во владение забирают строку и отдают ее из замыкания, остается только один вызов:

fn take_once(f: impl FnOnce() -> String) -> String { f() } fn main() { let city = String::from("oslo"); let give = move || city; let line = take_once(give); println!("{}", line); }

Дано число:

let step: i32 = 4;

Запишите замыкание с захватом step во владение, которое прибавляет его к аргументу, и дважды передайте его в функцию с повторными вызовами. Выведите оба результата.

Дана строка:

let name = String::from("ann");

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

Скажите, чем отличается захват копируемого числа с move от захвата строки, которую отдают наружу.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить