2015-02-14 10 views
6

Birisi, taşınan değerlerin ödünç alınmış yapılara taşınmasının neden taşınırken geçerli olmadığını açıklayabilir mi? Örneğin: Her iki durumda daMutabakattan ödünç alınmış bir yapıya taşınmak ve bunlardan hareket etmek

struct S { 
    v: Vec<u8> 
} 

fn move_v_out(s: &mut S) { 
    let old_vecotr = s.v; // If removed, program compiles fine 
    s.v = vec![]; 
} 

fn main() { 
    let mut v = S { 
     v: vec![] 
    }; 
    move_v_out(&mut v); 
} 

, bir mutably-ödünç yapının bir elemanı modifiye edilir. Ancak, bir derleme hatasına neden olur.

cevap

9

Asıl fark, ödünç alınan bir yapıdan bir değeri taşıdığınızda, onu daha sonra bütün bir yapı olarak kullanılmasını yasaklayan "kısmen taşınmış" durumuna bırakırsınız.

Bu durum, ödünç alınan değerler için yasaklanmıştır, çünkü işlevin sonunda geçerli olması gerekir ve derleyici (henüz?) Değeri doğru bir şekilde ayarladığınızı anlamaz. Eski VEC ayıklamak ve yenisiyle tarafından yerdeğiştirildi ne yapmak istediğinizi, standart kütüphane tam olarak işlev içeriyorsa

Ancak, gerek: std::mem::replace

fn move_v_out(s: &mut S) { 
    let old_vector = std::mem::replace(&mut s.v, vec![]); 
    // do something with old_vector 
} 
İlgili konular