我刚从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])
很抱歉,但对我来说这没有任何意义。
答案 0 :(得分:2)
在声明你的阵列时,你可能正在做
let myarray = Vec::new();
你称之为
set_values(0, 42, &mut my_array);
在上面的声明中,您正在从阵列中创建一个可变引用。因为你的函数需要一个对数组的可变引用,基本上类型必须匹配。够简单吗?
在您的函数中,数组的类型已知为&mut [u64]
所以你不需要从中做出可变引用,因为它已经是一个可变引用。 :)。
答案 1 :(得分:0)
递归调用与第一次调用的不同之处在于array
已经绑定到&mut [u64]
,因此您可以像第一个示例中那样传递它。
在第二个示例中,您尝试创建对array
的可变引用,但该绑定在函数头中声明为对可变引用的不可变绑定。
这就是编译器建议将array
更改为可变绑定的原因。