gpt4 book ai didi

rust - 将可变引用移出可变对象

转载 作者:行者123 更新时间:2023-11-29 07:59:38 25 4
gpt4 key购买 nike

我在 enum 上有一个迭代器,它的一个变体中有一个可变引用。现在我想将此引用移出 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();
}

问题与Change selector in match when selector is a mutable reference有关,但该解决方案在这里不起作用。

最佳答案

我会使用 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,
}
}
}

关于rust - 将可变引用移出可变对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44909967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com