구조에 대한 변경 가능한 참조가 있으며 함수를 전달하고 그 결과를 필드의 새 값으로 설정하여 해당 필드 중 하나를 변경하려고합니다. 그러나 "빌린 내용을 옮길 수 없다"는 오류가 발생합니다.빌린 내용을 안전하게 옮깁니다.
이 내 문제를 보여줍니다 최소한의 예입니다 : 이것은 내가 얻을 컴파일 오류입니다
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);
}
을 :
error[E0507]: cannot move out of borrowed content
--> src/main.rs:21:47
|
21 | my_struct_ref.inner_struct = do_something(my_struct_ref.inner_struct);
| ^^^^^^^^^^^^^ cannot move out of borrowed content
do_something
수행 내부 구조를 통해 소유권을 가지고 기능의 직업 (실제 출처는 Tokio 선물에서 운영됨).
동일한 제목의 게시물은 "빌려온 콘텐츠를 옮길 수 없습니다"라는 게시물이 많았습니다. 그 모두에 대한 해결책은 소유권을 이전하는 대신 무언가를 복제하거나 참조를 전달하는 것이지만 이러한 솔루션을 내 경우.
이 경우 Rust 컴파일러가 방어하려고하는 내용을 이해할 수 없습니다. 모든 가능성 있음을 생각하면 my_struct
은 일관되게 유지됩니다. 대신이 줄을 갖는
성공적으로 컴파일 :
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);
?
이 문제를 해결하는 방법에 대한 아이디어 나 내가 무엇을 잘못하고 안전하지 않은지에 대한 설명을 보내 주시면 감사하겠습니다.
나는 공황이 일종의 충돌이라고 생각했다. 공황 후 회복이 가능합니까? – real
나는 ['catch_unwind'] (https://doc.rust-lang.org/stable/std/panic/fn.catch_unwind.html)에 대한 문서가 이것을 아주 잘 설명한다고 생각합니다. "이 함수는 단지 풀리는 패닉만을 잡아줍니다. 그 과정을 중단하는 사람들. " – Stefan