代码之家  ›  专栏  ›  技术社区  ›  Manuel

Rust:递归传递数组

  •  1
  • Manuel  · 技术社区  · 7 年前

    以这个虚拟示例为例,我希望这是不言而喻的:

    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 回复  |  直到 7 年前
        1
  •  3
  •   Web3 Philosopher    7 年前

    声明数组时,您可能正在执行以下操作:

    let myarray = Vec::new();
    

    你称之为,

    set_values(0, 42, &mut my_array);
    

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

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

    因此,您不需要从中生成可变引用,因为它已经是可变引用。

        2
  •  0
  •   aeveris    7 年前

    array 已绑定到 &mut [u64] ,所以您可以像第一个示例中那样传递它。
    可变的 ,但该绑定在函数头中声明为 绑定到可变引用。
    这就是为什么编译器建议更改 转化为可变绑定。