如何移出作为选项的结构字段?
How do I move out of a struct field that is an Option?
我想收集对结构的更改并一次性全部应用。
基本大纲如下所示:
enum SomeEnum {
Foo,
Bar,
}
struct SomeStruct {
attrib: SomeEnum,
next_attrib: Option<SomeEnum>,
}
impl SomeStruct {
pub fn apply_changes(&mut self) {
if let Some(se) = self.next_attrib {
self.attrib = se;
}
self.next_attrib = None;
}
}
这会产生以下编译器错误:
error[E0507]: cannot move out of borrowed content
--> src/lib.rs:13:27
|
13 | if let Some(se) = self.next_attrib {
| -- ^^^^ cannot move out of borrowed content
| |
| hint: to prevent move, use `ref se` or `ref mut se`
我找到 并将 #[derive(Clone, Copy)]
添加到我的枚举定义中。
这可能有效,但我对(隐含地)使用复制感到不舒服,因为这通常也可能发生在较大的数据类型上。
实际所有者永远不会移出结构。
是否有另一种方法可以做到这一点,而不会将 Copy
/Clone
特征暴露给枚举的所有用户?
本质上,如果 self.attrib
仍由 self.next_atrrib
拥有,则不能将其赋值给它。这意味着您需要从 self.next_attrib
中删除值,然后将所有权授予 self.attrib
.
执行此操作的一种方法是手动替换该值。例如,您可以使用 std::mem::replace
将值替换为 None
,并将当前值的所有权设为 next_attrib
。然后就可以取值了,如果是Some(_)
,就可以把它的内容放在self.attrib
.:
impl SomeStruct {
pub fn apply_changes(&mut self) {
let next_attrib = std::mem::replace(&mut self.next_attrib, None);
if let Some(se) = next_attrib {
self.attrib = se;
}
}
}
由于这是一个相对常见的模式,但是 Option
上有一个实用函数来处理您想要获得 Option
内容的所有权并设置Option
到 None
。 Option::take
方法就是你想要的。
impl SomeStruct {
pub fn apply_changes(&mut self) {
if let Some(se) = self.next_attrib.take() {
self.attrib = se;
}
}
}
另请参阅:
- How can I swap in a new value for a field in a mutable reference to a structure?
我想收集对结构的更改并一次性全部应用。 基本大纲如下所示:
enum SomeEnum {
Foo,
Bar,
}
struct SomeStruct {
attrib: SomeEnum,
next_attrib: Option<SomeEnum>,
}
impl SomeStruct {
pub fn apply_changes(&mut self) {
if let Some(se) = self.next_attrib {
self.attrib = se;
}
self.next_attrib = None;
}
}
这会产生以下编译器错误:
error[E0507]: cannot move out of borrowed content --> src/lib.rs:13:27 | 13 | if let Some(se) = self.next_attrib { | -- ^^^^ cannot move out of borrowed content | | | hint: to prevent move, use `ref se` or `ref mut se`
我找到 #[derive(Clone, Copy)]
添加到我的枚举定义中。
这可能有效,但我对(隐含地)使用复制感到不舒服,因为这通常也可能发生在较大的数据类型上。
实际所有者永远不会移出结构。
是否有另一种方法可以做到这一点,而不会将 Copy
/Clone
特征暴露给枚举的所有用户?
本质上,如果 self.attrib
仍由 self.next_atrrib
拥有,则不能将其赋值给它。这意味着您需要从 self.next_attrib
中删除值,然后将所有权授予 self.attrib
.
执行此操作的一种方法是手动替换该值。例如,您可以使用 std::mem::replace
将值替换为 None
,并将当前值的所有权设为 next_attrib
。然后就可以取值了,如果是Some(_)
,就可以把它的内容放在self.attrib
.:
impl SomeStruct {
pub fn apply_changes(&mut self) {
let next_attrib = std::mem::replace(&mut self.next_attrib, None);
if let Some(se) = next_attrib {
self.attrib = se;
}
}
}
由于这是一个相对常见的模式,但是 Option
上有一个实用函数来处理您想要获得 Option
内容的所有权并设置Option
到 None
。 Option::take
方法就是你想要的。
impl SomeStruct {
pub fn apply_changes(&mut self) {
if let Some(se) = self.next_attrib.take() {
self.attrib = se;
}
}
}
另请参阅:
- How can I swap in a new value for a field in a mutable reference to a structure?