Один вызов замыкания в Rust
Если замыкание отдает захваченную строку наружу, второй вызов уже невозможен: значение ушло вместе с первым результатом. Для такого случая параметр ограничивают трейтом одного обращения.
Заберем строку из замыкания через функцию с таким параметром:
fn take_once(f: impl FnOnce() -> String) -> String {
f()
}
fn main() {
let name = String::from("ann");
let pack = move || name;
let text = take_once(pack);
println!("{}", text);
}
Замыкание pack забирает name
во владение и отдает его строкой. После
работы take_once повторно передать
то же замыкание нельзя: трейт одного вызова
не допускает второго обращения.
Тот же прием годится, когда результат нужно вернуть вызывающему коду, а не только напечатать:
fn label_once(f: impl FnOnce() -> String) -> String {
f()
}
fn main() {
let city = String::from("oslo");
let make = move || city;
let line = label_once(make);
let ready = format!("city {}", line);
println!("{}", ready);
}
Дана строка:
let word = String::from("go");
Запишите замыкание без аргументов, которое
отдает word, передайте его в функцию
из урока и выведите полученный текст.
Дана строка:
let tag = String::from("rust");
Сделайте замыкание, которое возвращает
tag, один раз передайте его в
общую функцию и скажите, можно ли
обратиться к тому же замыканию еще раз.
Скажите, почему после первого обращения к замыканию со строкой внутри повторная передача в функцию не собирается.