を住んでいない:借用は十分な長さ
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)と宣言するように指示しますが、なぜこれが必要なのですか?
閉包に2つの参照 - &|c: &char|
が含まれていなければならない理由もわかりません。 "abc123".chars()
は単純にcharsのイテレータを作成しませんか?
関連性:http://stackoverflow.com/q/31374051/155423;近くの複製:http://stackoverflow.com/q/28776630/155423、http://stackoverflow.com/q/23969191/155423、[working code](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