Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 安全地移出借用的内容_Rust_Borrow Checker - Fatal编程技术网

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
有效

如果有一种通用的说法“如果这场恐慌只是崩溃而不是放松”,那就太好了。据我所知,这将使这样的操作变得安全


从板条箱提供了一个安全的包装(它捕捉到了展开的恐慌,并使其中止,从而解决了展开的问题)。

我认为恐慌是一种崩溃。恐慌过后有可能恢复吗?我想医生会解释得很好——“这个函数只捕捉正在解除的恐慌,而不是那些中止过程的恐慌。”我认为恐慌是一种崩溃。恐慌过后有可能恢复吗?我想文档会解释得很好——“这个函数只捕捉正在解除的恐慌,而不是那些中止过程的恐慌。”