当我尝试编译此代码(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