示例代码:
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
答案 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
的值将保持不变。