Rust:递归传递数组

Rust: passing array recursively

刚开始接触Rust,已经百感交集。 以这个虚拟示例为例,我希望这是不言自明的:

fn set_values(pos: usize, val: u64, array: &mut [u64]) {
    if pos >= array.len() {
        return;
    }
    array[pos] = val;
    set_values(pos+1, val+1, array);
}

这可以正常调用:

set_values(0, 42, &mut my_array);

我在第一个函数调用中完全理解 &mut 背后的原因,但为什么在递归调用期间我不必指定它?

不仅如此,如果我决定写 set_values(pos+1, val+1, &mut array); 然后编译器会抱怨并告诉我必须将函数签名更改为

fn set_values(pos: usize, val: u64, mut array: &mut [u64])

抱歉,但这对我来说没有任何意义。

声明数组时,您可能正在做

let myarray = Vec::new();

你称之为,

set_values(0, 42, &mut my_array);

在上面的语句中,您从数组中创建了一个可变引用。因为您的函数需要对数组的可变引用,所以基本上类型必须匹配。够简单吗?

在您的函数中,数组类型已被称为 &mut [u64]

因此您不需要从中创建可变引用,因为它已经是可变引用。 :).

递归调用与第一个调用的不同之处在于 array 已经绑定到 &mut [u64],因此您可以像在第一个示例中那样传递它。
在第二个示例中,您尝试创建对 arraymutable 引用,但该绑定在函数头中声明为 immutable 绑定到可变引用。
这就是编译器建议将 array 更改为可变绑定的原因。