2017-11-25 21 views
0

구조에 대한 변경 가능한 참조가 있으며 함수를 전달하고 그 결과를 필드의 새 값으로 설정하여 해당 필드 중 하나를 변경하려고합니다. 그러나 "빌린 내용을 옮길 수 없다"는 오류가 발생합니다.빌린 내용을 안전하게 옮깁니다.

이 내 문제를 보여줍니다 최소한의 예입니다 : 이것은 내가 얻을 컴파일 오류입니다

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); 

?

이 문제를 해결하는 방법에 대한 아이디어 나 내가 무엇을 잘못하고 안전하지 않은지에 대한 설명을 보내 주시면 감사하겠습니다.

답변

2

do_something 패닉 풀기가 불가능한 경우 my_struct_ref을 유효한 상태로 복원 할 수 없지만 외부 컨텍스트에 my_struct_ref이 유효해야합니다.

"이 패닉이 긴장을 풀지 않고 그냥 부숴 버리는 경우"라고 말하는 일반적인 방법이 있다면 좋을 것입니다. 그러면 내가 말할 수있는 한 그러한 작업을 안전하게 수행 할 수 있습니다.

taketake_mut 크레이트는 안전한 래퍼를 제공합니다 (풀리는 패닉을 잡아 내고 대신 중단하여 문제를 해결합니다).

+0

나는 공황이 일종의 충돌이라고 생각했다. 공황 후 회복이 가능합니까? – real

+1

나는 ['catch_unwind'] (https://doc.rust-lang.org/stable/std/panic/fn.catch_unwind.html)에 대한 문서가 이것을 아주 잘 설명한다고 생각합니다. "이 함수는 단지 풀리는 패닉만을 잡아줍니다. 그 과정을 중단하는 사람들. " – Stefan