2016-04-02 3 views
5

में एक और उधार लेने मैं एक struct दो क्षेत्रों से युक्त है और मैं एक क्षेत्र (परिवर्तनशील उधार) एक और क्षेत्र (अपरिवर्तनीय उधार) का उपयोग कर संशोधित करना चाहते हैं, लेकिन मैं उधार चेकर से कोई त्रुटि मिलती है।Mutably एक struct क्षेत्र उधार जबकि एक बंद

उदाहरण के लिए, निम्न कोड:

error[E0502]: cannot borrow `strct` as immutable because `strct.field1` is also borrowed as mutable 
    --> src/main.rs:12:25 
    | 
12 |  strct.field1.retain(|v| !strct.field2.contains(v)); 
    |  ------------  ^^^ -----     - mutable borrow ends here 
    |  |     | | 
    |  |     | borrow occurs due to use of `strct` in closure 
    |  |     immutable borrow occurs here 
    |  mutable borrow occurs here 

क्या एक बंद के अंदर से ही उपयोग करते हुए एक क्षेत्र को अद्यतन करने की जंग तरीके हैं:

struct Struct { 
    field1: Vec<i32>, 
    field2: Vec<i32>, 
} 

fn main() { 
    let mut strct = Struct { 
     field1: vec![1, 2, 3], 
     field2: vec![2, 3, 4], 
    }; 

    strct.field1.retain(|v| !strct.field2.contains(v)); 

    println!("{:?}", strct.field1); 
} 

निम्न त्रुटि देता है?

उत्तर

11

आमतौर पर उधारकर्ता चेकर संरचना के विभिन्न क्षेत्रों के बीच अंतर कर सकता है, लेकिन यह बंद (लम्बदास) के भीतर काम नहीं करता है।

इसके बजाय, बंद के बाहर दूसरे क्षेत्र उधार:

let field2 = &strct.field2; 
strct.field1.retain(|v| !field2.contains(v)); 
+0

धन्यवाद! मुझे आश्चर्य है कि यह बंद होने के भीतर क्यों काम नहीं करता है, हालांकि ... –

संबंधित मुद्दे