"Cannot borrow `*arr` as immutable because it is also borrowed as mutable" 在函数调用中

"Cannot borrow `*arr` as immutable because it is also borrowed as mutable" in a function call

请有人解释下面的代码,它怎么会不安全,为什么 borrowchecker 在这里抱怨?我对 Rust 很陌生,我有一点 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);
}