从可变对象中移出可变引用

3

我有一个枚举类型的迭代器,其中一个变量包含可变引用。现在我想将这个引用从self中移出并返回它。为了避免同时拥有两个指向同一对象的可变引用,我希望将self的枚举变量更改为不包含该引用的变量。以下是代码示例:

enum Test<'a> {
    A(&'a mut usize),
    B,
}

impl<'a> Iterator for Test<'a> {
    type Item = &'a mut usize;

    fn next(&mut self) -> Option<Self::Item> {
        match *self {
            Test::A(r) => Some(r), // TODO: return mutable reference and change self to B
            Test::B => None,
        }
    }
}

fn main() {
    let mut v = 1;
    let mut it = Test::A(&mut v);
    it.next();
}

这个问题与更改可变引用下的匹配选择器有关,但那个解决方案在这里不起作用。
1个回答

3
我会使用swap函数:
fn next(&mut self) -> Option<Self::Item> {
    if let Test::A(_) = *self {
        let mut to_swap = Test::B;

        std::mem::swap(self, &mut to_swap);
        match to_swap {
            Test::A(r)  => Some(r),
            _           => unreachable!(), // never reached
        }
    } else {
        None
    }
}

您可以使用以下助手函数:
impl<'a> Iterator for Test<'a> {
    type Item = &'a mut usize;

    fn next(&mut self) -> Option<Self::Item> {
        if let Test::A(_) = *self {
            let mut to_swap = Test::B;

            std::mem::swap(self, &mut to_swap);
            to_swap.consume_as_a()
        } else {
            None
        }
    }
}

impl<'a> Test<'a> {
    fn consume_as_a(self) -> Option<&'a mut usize> {
        match self {
            Test::A(r)  => Some(r),
            _           => None,
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接