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 =>(),
}
}
İlk örneğinizi OP koduna göre açıklayabilir misiniz? Tam olarak nasıl farklıdır ve Copy burada nasıl oynanır? –
@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
Belki bir 'eşleşme'den daha güzel okuyabilseydi? – Shepmaster