Rust 安全地移出借用的内容
我有一个对结构的可变引用,我想通过一个函数来改变它的一个字段,并将结果设置为字段的新值。但是,我得到一个“无法移出借用内容”编译错误 这是一个简单的例子,说明了我的问题:Rust 安全地移出借用的内容,rust,borrow-checker,Rust,Borrow Checker,我有一个对结构的可变引用,我想通过一个函数来改变它的一个字段,并将结果设置为字段的新值。但是,我得到一个“无法移出借用内容”编译错误 这是一个简单的例子,说明了我的问题: struct InnerStruct { num: usize, } struct MyStruct { inner_struct: InnerStruct, } fn do_something(inner_struct: InnerStruct) -> InnerStruct { inner
struct InnerStruct {
num: usize,
}
struct MyStruct {
inner_struct: InnerStruct,
}
fn do_something(inner_struct: InnerStruct) -> InnerStruct {
inner_struct
}
fn main() {
let mut my_struct = MyStruct {
inner_struct: InnerStruct { num: 0 },
};
let my_struct_ref = &mut my_struct;
// This line compiles:
// my_struct_ref.inner_struct = InnerStruct { num: 0 };
my_struct_ref.inner_struct = do_something(my_struct_ref.inner_struct);
}
这是我得到的编译错误:
错误[E0507]:无法移出借用的内容
-->src/main.rs:21:47
|
21 | my_struct_ref.internal_struct=做某事(my_struct_ref.internal_struct);
|^^^^^^^^^^^^^^^^^^无法移出借用的内容
功能dou_something
必须接管内部结构以执行其工作(在真正的源代码中,它在东京期货上运行)
我有很多帖子的标题都是“不能从借来的内容中移出”,所有这些帖子的解决方案都是克隆某些内容或传递引用,而不是移动所有权,但我无法将这些解决方案应用到我的案例中
我不明白在这种情况下,锈编译器试图防御什么。在我所能想到的每一种可能性中,我的结构都保持一致
改为使用此行可成功编译:
my_struct_ref.inner_struct = InnerStruct { num: 0 };
以下三条线也适用:
let inner_struct2 = InnerStruct { num: 0 };
let inner_struct = std::mem::replace(&mut my_struct_ref.inner_struct, inner_struct2);
my_struct_ref.inner_struct = do_something(inner_struct);
为什么这被认为是安全的,而第一个代码不是
我将非常感谢任何关于如何解决这一问题的想法,或者关于我正在尝试做的事情的错误/不安全之处的解释。如果
做一些事情
恐慌不可能解除-您无法将我的结构(u ref
恢复到有效状态,但外部上下文要求我的结构(u ref
有效
如果有一种通用的说法“如果这场恐慌只是崩溃而不是放松”,那就太好了。据我所知,这将使这样的操作变得安全
从板条箱提供一个安全的包装(它捕捉到一个展开的恐慌,并使其中止,从而解决展开问题)。如果
做某事恐慌不可能展开-您无法将my_struct_ref
恢复到有效状态,但外部上下文要求my_struct_ref
有效
如果有一种通用的说法“如果这场恐慌只是崩溃而不是放松”,那就太好了。据我所知,这将使这样的操作变得安全
从板条箱提供了一个安全的包装(它捕捉到了展开的恐慌,并使其中止,从而解决了展开的问题)。我认为恐慌是一种崩溃。恐慌过后有可能恢复吗?我想医生会解释得很好——“这个函数只捕捉正在解除的恐慌,而不是那些中止过程的恐慌。”我认为恐慌是一种崩溃。恐慌过后有可能恢复吗?我想文档会解释得很好——“这个函数只捕捉正在解除的恐慌,而不是那些中止过程的恐慌。”