2015-10-27 16 views
5

Bir vektörün son elemanını almak ve içeriye itilecek bir sonraki öğeyi belirlemek için kullanmak istiyorum. İşte bir örnek nasıl çalışmıyor? Ben başarmak için deneyin:Son elemanına bağlı olarak bir vektöre bir şey iterek

let mut vector: Vec<i32> = Vec::new(); 

match vector.last() { 
    Some(last_value) => vector.push(*last_value + 1), 
    None =>(), 
} 

sorun vektör ayrıca immutably ödünç ederken itme kullanamazsınız olmasıdır. Bunu yapmanın iyi bir yolu ne olurdu?

cevap

7

vector.last() sonucu Option<&i32>'dur. Bu değerdeki referans, ödünç alınan vektör tutar. Ona itmeden önce vektöre tüm referanslardan kurtulmamız gerekiyor.

Vektörünüz Copy kullanılabilir değerler içeriyorsa, ödemenizi daha çabuk bitirmek için vektörün değerini kopyalayın. İşte

fn main() { 
    let mut vector: Vec<i32> = Vec::new(); 

    match vector.last() { 
     Some(&last_value) => vector.push(last_value + 1), 
     None =>(), 
    } 
} 

, ben deseni yerine Some(last_value) ait Some(&last_value) kullandım. Bu , referansını imha eder ve bir kopyasını zorlar.

<anon>:5:14: 5:25 error: cannot move out of borrowed content 
<anon>:5   Some(&last_value) => vector.push(last_value + "abc"), 
         ^~~~~~~~~~~ 

Copy mümkün tiplerini içermiyor vektör, önce değeri klonlamak isteyebilirsiniz ise:

Eğer mümkün değildir Copy bir türü ile bu modeli çalışırsanız, bir derleyici hatası alırsınız
fn main() { 
    let mut vector: Vec<String> = Vec::new(); 

    match vector.last().map(|v| v.clone()) { 
     Some(last_value) => vector.push(last_value + "abc"), 
     None =>(), 
    } 
} 

Veya değeri .map() aramasının vektörden ödünç alınmayan bir değer döndürecek şekilde başka bir şekilde dönüştürebilirsiniz.

fn main() { 
    let mut vector: Vec<String> = Vec::new(); 

    // Push a string containing the length of the last element. 
    match vector.last().map(|v| v.len().to_string()) { 
     Some(new_value) => vector.push(new_value), 
     None =>(), 
    } 
} 
+0

İlk örneğinizi OP koduna göre açıklayabilir misiniz? Tam olarak nasıl farklıdır ve Copy burada nasıl oynanır? –

+1

@JimmyCuadra OP kodunda 'last_value()' 'last_value' ile eşleşir. Last_value() işlevi bir referans döndürdüğünden, “last_value” da bir referans olur. Ancak, Francis deseni '& last_value' olarak değiştirdi, bu yüzden referans '&' ile eşleşiyor ve değerin kendisi "last_value" ile eşleşiyor ve bu yüzden değerle kopyalanıyor. Buna yıkım denir. – Malcolm

+2

Belki bir 'eşleşme'den daha güzel okuyabilseydi? – Shepmaster

İlgili konular