當我嘗試編譯此代碼(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我想我想問的是如何克隆一個迭代器(在我被錯誤消息弄糊塗之前)。所以我怎麼做[this](例如https://play.rust-lang.org/?gist=a8f4f33423f100f857ffe2ce4f0263a8&version=stable&backtrace=0)(我知道這不是最好的辦法)。 – gib