Rust:递归传递数组

时间:2017-08-20 21:01:08

标签: arrays recursion reference rust mutability

我刚从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])

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

2 个答案:

答案 0 :(得分:2)

在声明你的阵列时,你可能正在做

let myarray = Vec::new();

你称之为

set_values(0, 42, &mut my_array);

在上面的声明中,您正在从阵列中创建一个可变引用。因为你的函数需要一个对数组的可变引用,基本上类型必须匹配。够简单吗?

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

所以你不需要从中做出可变引用,因为它已经是一个可变引用。 :)。

答案 1 :(得分:0)

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