我不知道有这样的迭代器,但创建自己的迭代器并不复杂:
struct X<'a, T: 'a> {
item: &'a T,
before: &'a [T],
after: &'a [T],
}
struct AllButOne<'a, T: 'a> {
slice: &'a [T],
index: usize,
}
impl<'a, T> AllButOne<'a, T> {
fn new(slice: &'a [T]) -> Self {
AllButOne { slice, index: 0 }
}
}
impl<'a, T> Iterator for AllButOne<'a, T> {
type Item = X<'a, T>;
fn next(&mut self) -> Option<Self::Item> {
if self.index > self.slice.len() {
return None;
}
let (before, middle) = self.slice.split_at(self.index);
let (middle, after) = middle.split_at(1);
self.index += 1;
Some(X {
before,
after,
item: &middle[0],
})
}
}
fn main() {
let a = [1, 2, 3, 4];
for x in AllButOne::new(&a) {
println!("{:?}, {}, {:?}", x.before, x.item, x.after);
}
}
Run Code Online (Sandbox Code Playgroud)
[], 1, [2, 3, 4]
[1], 2, [3, 4]
[1, 2], 3, [4]
[1, 2, 3], 4, []
Run Code Online (Sandbox Code Playgroud)
这将返回两个切片,一个用于当前项之前的所有值,另一个用于after.如果需要,您可以执行分配并将它们粘贴到同一个集合中.