Когда я пытаюсь скомпилировать этот код (playground):Займитесь закрытия фильтра, не живут достаточно долго
fn main() {
let iter = "abc123".chars().filter(&|&c: &char| c.is_digit(10));
match iter.clone().take(3).count() {
3 => println!("{}", iter.collect::<String>()),
_ => {}
}
}
Я получаю следующее сообщение об ошибке:
error: borrowed value does not live long enough
--> test.rs:2:41
|
2 | let iter = "abc123".chars().filter(&|c: &char| c.is_digit(10));
| ^^^^^^^^^^^^^^^^^^^^^^^^^ - temporary value only lives until here
| |
| temporary value created here
...
7 | }
| - temporary value needs to live until here
|
= note: consider using a `let` binding to increase its lifetime
Я понимаю, что ошибка услужливо говоря, что я объявляю закрытие в строке выше с let f = &|c: &char| c.is_digit(10);
(working code), но почему именно это необходимо?
Я также не знаю, почему закрытие должно содержать две ссылки - &|c: &char|
. Не "abc123".chars()
просто создать итератор символов?
Релевантно: http://stackoverflow.com/q/31374051/155423; около дубликатов: http://stackoverflow.com/q/28776630/155423, http://stackoverflow.com/q/23969191/155423, [рабочий код] (http://play.integer32.com/?gist=feb39ad6c2bd1641dcf463b65d560986&version = стабильный); TL; DR: вы, вероятно, хотите использовать 'by_ref'. – Shepmaster
@Shepmaster Я предполагаю, что я пытался спросить, как клонировать Iterator (до того, как я запутался в сообщении об ошибке). Итак, как бы я это сделал (https://play.rust-lang.org/?gist=a8f4f33423f100f857ffe2ce4f0263a8&version=stable&backtrace=0) например (я знаю, что это не лучший способ сделать это). – gib