Пожалуйста, кто-нибудь объясните приведенный ниже код и почему он может быть небезопасным, и почему заемщик жалуется здесь? Я очень новичок в ржавчине, и я немного знаком с C/C++.
fn test(a: &mut [i32], place: usize) -> i32 {
a[place] /= 2;
return a[place];
}
fn main() {
let mut values = vec![1, 2, 3, 4];
let b = test(&mut values, values.len() / 2); // compiler gives error on values.len()
}
Почему это работает, если сначала присвоить переменную с помощью values.len()/2 и передать ее функции?

Проблема возникает из-за того, что вы пытаетесь сделать две разные вещи с values в двух разных позициях аргументов, а текущая реализация Rust недостаточно умна, чтобы определить, что этот вариант использования не проблематичен.
Вы можете исправить это, выполнив это вместо этого:
fn test(a: &mut [i32], place: usize) -> i32 {
a[place] /= 2;
return a[place];
}
fn main() {
let mut values = vec![1, 2, 3, 4];
let l = values.len() / 2;
let b = test(&mut values, l);
}
две разные вещи означают попытку передать изменяемую ссылку и вызвать функцию len, верно? Спасибо за ответ кстати. Rust еще предстоит пройти долгий путь, если он не может справиться с такими вещами.
@ankit: Да, функция len требует собственного неизменяемого заимствования, и вы также хотите передать изменяемое заимствование.
Отвечает ли это на ваш вопрос? Невозможно заимствовать как изменяемый, потому что он также заимствован как неизменяемый