«Невозможно заимствовать `*arr` как неизменяемый, потому что он также заимствован как изменяемый» в вызове функции

Пожалуйста, кто-нибудь объясните приведенный ниже код и почему он может быть небезопасным, и почему заемщик жалуется здесь? Я очень новичок в ржавчине, и я немного знаком с 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 и передать ее функции?

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
1
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема возникает из-за того, что вы пытаетесь сделать две разные вещи с 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 14.05.2022 15:00

@ankit: Да, функция len требует собственного неизменяемого заимствования, и вы также хотите передать изменяемое заимствование.

hkBst 14.05.2022 15:02

Другие вопросы по теме

Типизированное заимствованное значение универсального типа не живет достаточно долго в совпадении
Способы исправления изменяемого заимствования self в аргументах функции, которая заимствует изменяемое self
Избегайте использования частично перемещенного значения в операторе соответствия
Невозможно построить из ссылки в универсальной функции (значение не живет достаточно долго)
Как решить «Возвращает значение, ссылающееся на данные, принадлежащие текущей функции» (фактические различия между структурами)
Rust: Почему я не могу переместить значение дважды?
Удовлетворение проверки заимствования структурой, которая обрабатывает очередь действий
Строка заимствования работает только за пределами блока match
Почему я могу вернуть собственное значение, которое использует 'char.to_ascii_lowercase()', но не `str.to_lowercase()`
Почему рефакторинг путем извлечения метода вызывает ошибку проверки заимствования?