Po wywołaniu .last()
pożyczysz nums
jako niezmienną, ponieważ mutacja spowoduje unieważnienie posiadanego odniesienia x
. Następnie należy wywołać .push
, która pożycza nums
jako zmienną.
Problemem jest to, że masz teraz niezmienna i jest zmienny pożyczyć tej samej wartości w tym samym czasie, co jest niezgodne z pamięcią rdzewieje gwarancje bezpieczeństwa (wielu czytelników lub jedna gwarancja pojedynczego pisarza, który nigdy nie będzie miało nieprawidłową pamięć gdziekolwiek).
fn main() {
let mut nums = vec![1, 2, 3];
if let Some(x) = nums.last() { // Immutable borrow starts here
nums.push(*x); // Mutable borrow starts here
} // Immutable and mutable borrows end here
}
Rozwiązaniem byłoby obniżyć zakres niezmiennej pożyczyć od razu spada odniesienie jej wynik, jak na @ DanielSanchez na przykład:
let mut nums = vec![1, 2, 3];
if let Some(&x) = nums.last() { // Immutable borrow starts and ends here
nums.push(x); // Mutable borrow starts here
} // Mutable borrow ends here
nie wiedząc, rdza, to nie może jak robi Nums .last() w tej samej instrukcji co nums.push(), ponieważ wartość nums.last() może się zmienić po naciśnięciu nowego wpisu na nums. – jwenting