gpt4 book ai didi

variables - 为什么不可变变量可以作为参数传递给需要可变参数的函数?

转载 作者:行者123 更新时间:2023-11-29 08:05:53 25 4
gpt4 key购买 nike

示例代码:

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

最佳答案

按值传递时,您正在转移值的所有权。不需要变量的副本——首先 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 trait。如果您在将所有权授予 reset 之后尝试使用 a,则会生成一个隐式副本。 a 的值将保持不变。

关于variables - 为什么不可变变量可以作为参数传递给需要可变参数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54120899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com