Захват во владение в 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 от захвата строки,
которую отдают наружу.