为什么不能将不可变变量作为参数传递给需要可变参数的函数?

时间:2019-01-10 01:46:07

标签: variables syntax rust immutability mutable

示例代码:

fn main() {
    let a = [1, 2, 3, 4, 5];
    reset(a);
}

fn reset(mut b: [u32; 5]) {
    b[0] = 5;
}

变量a是一个不可变数组,而reset函数的参数b是一个可变数组;凭直觉,我需要先将a修改为可变数组,然后才能调用reset方法,但是编译器告诉我不需要这样做,为什么?

fn main() {
    let mut a = [1, 2, 3, 4, 5];
    reset(a);
}

fn reset(mut b: [u32; 5]) {
    b[0] = 5;
}
warning: variable does not need to be mutable
 --> src/main.rs:2:9
  |
2 |     let mut a = [1, 2, 3, 4, 5];
  |         ----^
  |         |
  |         help: remove this `mut`
  |
  = note: #[warn(unused_mut)] on by default

1 个答案:

答案 0 :(得分:3)

按价值传递时,您正在转移价值的所有权。不需要变量的副本-首先main拥有它,然后reset拥有它,然后消失了 1

在Rust中,当您拥有一个变量的所有权时,您可以控制它的可变性。例如,您可以这样做:

let a = [1, 2, 3, 4, 5];
let mut b = a;

您也可以在reset内执行相同的操作,尽管我不会 这样做,而是希望在函数签名中使用mut

fn reset(b: [u32; 5]) {
    let mut c = b;
    c[0] = 5;
}

另请参阅:


1 —在此特定情况下,您的类型为[i32; 5],它实现了Copy特性。如果您在将所有权授予a之后尝试使用reset,则将创建一个隐式副本。 a的值将保持不变。