мутабельные слайсы и borrow checker
От: sergii.p  
Дата: 15.02.23 10:12
Оценка:
споткнулся на такой забавный момент. Пока не понимаю причины
Такой код ругается на наличие изменяемой и неизменяемой ссылки одновременно
fn foo(nums: &mut[u32]) {
    todo!()
}

fn main() {
    let mut nums = [1, 2, 3, 4, 5, 6, 7];
    foo(&mut nums[0..nums.len() - 1]);
}


error[E0502]: cannot borrow `nums` as immutable because it is also borrowed as mutable
 --> src/main.rs:7:22
  |
7 |     foo(&mut nums[0..nums.len() - 1]);
  |              --------^^^^^^^^^^-----
  |              |       |
  |              |       immutable borrow occurs here
  |              mutable borrow occurs here
  |              mutable borrow later used here


а такой проходит нормально

fn main() {
    let mut nums = [1, 2, 3, 4, 5, 6, 7];
    let last = nums.len() - 1;
    foo(&mut nums[0..last]);
}


Мне казалось что первый код должен автоматом переходить во второй. Но получается диапазоны вносят какие-то модификации в этот алгоритм.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.