[英]How do I use a Peekable iterator in a filter closure?
我只需要找到下一個數字相同的數字: [1,2,2,3,4,4]
應該產生[2,4]
。 因為我需要查看下一個數字,我想我會嘗試使用Peekable
迭代器並編寫一個filter
。
fn main() {
let xs = [1, 2, 2, 3, 4, 4];
let mut iter = xs.iter().peekable();
let pairs = iter.filter(move |num| {
match iter.peek() {
Some(next) => num == next,
None => false,
}
});
for num in pairs {
println!("{}", num);
}
}
我收到一個錯誤:
error[E0382]: capture of moved value: `iter`
--> src/main.rs:6:15
|
5 | let pairs = iter.filter(move |num| {
| ---- value moved here
6 | match iter.peek() {
| ^^^^ value captured here after move
|
= note: move occurs because `iter` has type `std::iter::Peekable<std::slice::Iter<'_, i32>>`, which does not implement the `Copy` trait
我認為這是因為閉包使用了iter
,但它沒有借用它,也無法復制它。
如何解決這個想要在過濾器中引用迭代器的問題?
引用過濾器內的迭代器
我不相信你能。 當您調用filter
,它將獲得基本迭代器的所有權:
fn filter<P>(self, predicate: P) -> Filter<Self, P>
where
P: FnMut(&Self::Item) -> bool,
一旦你這樣做,它就消失了。 有沒有更多的iter
。 在某些類似的情況下,您可以使用Iterator::by_ref
來可變地借用迭代器,將其驅動一段時間,然后返回原始版本。 在這種情況下,這將不起作用,因為內部迭代器需要第二次可變地借用它,這是不允許的。
找到下一個數字相同的數字。
extern crate itertools;
use itertools::Itertools;
fn main() {
let input = [1, 2, 2, 3, 4, 4];
let pairs = input
.iter()
.tuple_windows()
.filter_map(|(a, b)| if a == b { Some(a) } else { None });
let result: Vec<_> = pairs.cloned().collect();
assert_eq!(result, [2, 4]);
}
或者如果你想要只使用標准庫的東西:
fn main() {
let xs = [1, 2, 2, 3, 4, 4];
let mut prev = None;
let pairs = xs.iter().filter_map(move |curr| {
let next = if prev == Some(curr) { Some(curr) } else { None };
prev = Some(curr);
next
});
let result: Vec<_> = pairs.cloned().collect();
assert_eq!(result, [2, 4]);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.