Ошибки заимствования
Как конкретный пример того, как эти правила заимствования предотвращают ошибки памяти, рассмотрим изменение коллекции, пока существуют ссылки на её элементы:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let mut vec = vec![1, 2, 3, 4, 5];
let elem = &vec[2];
vec.push(6);
dbg!(elem);
}
Аналогично рассмотрим инвалидацию итератора:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let mut vec = vec![1, 2, 3, 4, 5];
for elem in &vec {
vec.push(elem * 2);
}
}
This slide should take about 3 minutes.
- В обоих случаях изменение коллекции добавлением новых элементов может сделать недействительными существующие ссылки на элементы коллекции, если коллекции придётся перевыделить память.