你能获得一个集合的所有值的迭代器,除了一个和对该元素的引用吗?

daw*_*kot 2 rust

我想迭代客户端Vec并使用一个方法处理每个客户端,该方法应该将所有其他客户端作为参数.

She*_*ter 8

我不知道有这样的迭代器,但创建自己的迭代器并不复杂:

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.如果需要,您可以执行分配并将它们粘贴到同一个集合中.