gpt4 book ai didi

reference - 循环变量之前 `&`的作用是什么?

转载 作者:行者123 更新时间:2023-12-03 11:48:04 24 4
gpt4 key购买 nike

代码&&i in list的作用是什么?如果我删除&,则会在largest = i中产生错误,因为它们的类型不匹配(其中i&32ii32)。但是&i如何将i转换为i32

fn largest(list: &[i32]) -> i32 {
println!("{:?}", list);
let mut largest = list[0];
for &i in list {
if i > largest {
largest = i;
}
}
largest
}

fn main() {
let hey = vec![1, 3, 2, 6, 90, 67, 788, 12, 34, 54, 32];
println!("The largest number is: {}", largest(&hey));
}

Playground

似乎在某种程度上取消了引用,但是为什么在下面的代码中,它不起作用?
fn main() {
let mut hey: i32 = 32;
let x: i32 = 2;
hey = &&x;
}

它说:

4 |     hey = &&x;
| ^^^ expected i32, found &&i32
|
= note: expected type `i32`
found type `&&i32`

最佳答案

因此,通常当您使用for i in list时,循环变量i的类型将为&i32

但是,当您改为使用for &i in list时,您并没有取消引用任何内容,而是在时,使用模式匹配来显式解构引用,这将使i只是i32类型。

请参阅Rust文档,了解我们在此处使用的for循环变量being a patternreference pattern。另请参阅destructuring pointers上的“按示例使用rust ”一章。

解决此问题的另一种方法是只保留i不变,然后将i与对largest的引用进行比较,然后在分配给i之前取消对largest的引用:

fn largest(list: &[i32]) -> i32 {
println!("{:?}", list);
let mut largest = list[0];
for i in list {
if i > &largest {
largest = *i;
}
}
largest
}



fn main() {
let mut hey: i32 = 32;
let x: i32 = 2;
hey = &&x;
}


这根本行不通,因为在这里您将 hey(即 i32)分配给对 i32的引用的引用。这与循环变量情况下的模式匹配和解构无关。

关于reference - 循环变量之前 `&`的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63184762/

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