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]
,因此您可以像在第一个示例中那样传递它。
在第二个示例中,您尝试创建对 array
的 mutable 引用,但该绑定在函数头中声明为 immutable 绑定到可变引用。
这就是编译器建议将 array
更改为可变绑定的原因。
刚开始接触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]
,因此您可以像在第一个示例中那样传递它。
在第二个示例中,您尝试创建对 array
的 mutable 引用,但该绑定在函数头中声明为 immutable 绑定到可变引用。
这就是编译器建议将 array
更改为可变绑定的原因。