For loop Rust错误应为类型“”()`找到类型“”(i32,i32)`

For loop Rust错误应为类型“”()`找到类型“”(i32,i32)`,for-loop,rust,numbers,tuples,For Loop,Rust,Numbers,Tuples,刚开始生锈,决定用刷子刷一下。我正在使用以下函数: fn find_numbers_2020(v: Vec<i32>) -> (i32,i32) { let mut n1: i32 = 0; let mut n2: i32 = 0; let mut cnt = 0; let size = v.len(); for v_i in v { n1 = v_i; cnt = cnt+1; for i

刚开始生锈,决定用刷子刷一下。我正在使用以下函数:

fn find_numbers_2020(v: Vec<i32>) -> (i32,i32) {
    let mut n1: i32 = 0;
    let mut n2: i32 = 0;
    let mut cnt = 0;
    let size = v.len();
    for v_i in v {
        n1 = v_i;
        cnt = cnt+1;
        for i in cnt..size {
            if (n1 + *v.get(i).unwrap()) == 2020 {
                n2 = *v.get(i).unwrap();
                (n1, n2) //Issue is here
            }
        }
    }
    (n1, n2)
 }
它是从main调用的,如下所示

fn main() {
     let filename = String::from("./input.txt");
     let v = parse_file(filename); //This works fine
     for v_i in v {
          println!("{}", v_i);
     }
     let result = find_numbers_2020(v);
     let (n1, n2) = result;
     println!("{} + {} = {}", n1, n2, n1+n2);
     println!("{} * {} = {}", n1, n2, n1*n2);
}

我还应该提到
v
是一个
Vec
。对于初学者的问题,很抱歉,Rust可能会有点混乱,我无法通过谷歌搜索找到任何答案。

只有当返回值是函数块中的最后一个表达式时,才可以省略
return
关键字,否则需要显式使用
return
。将
return
添加到示例中可以修复该特定错误,但会出现一系列新错误。下面是我编写函数的方法:

fn find_numbers_2020(v: Vec<i32>) -> (i32,i32) {
    let mut n1: i32 = 0;
    let mut n2: i32 = 0;
    let mut cnt = 0;
    let size = v.len();
    for v_i in v {
        n1 = v_i;
        cnt = cnt+1;
        for i in cnt..size {
            if (n1 + *v.get(i).unwrap()) == 2020 {
                n2 = *v.get(i).unwrap();
                (n1, n2) //Issue is here
            }
        }
    }
    (n1, n2)
 }
fn查找编号\u 2020(v:Vec)->(i32,i32){
对于v.iter()中的(跳过,&n1)枚举(){
用于v.iter()中的&n2。跳过(跳过){
如果n1+n2==2020{
返回(n1,n2);
}
}
}
恐慌!(“到2020年为止,vec中没有一对数字”);
}

这是需要使用。您的初始值也会消耗
v
,因此为了能够在内部循环中使用,您需要借用
v
,即
&v

fn查找编号\u 2020(v:Vec)->(i32,i32){
设mut n1:i32=0;
设mut n2:i32=0;
设mut-cnt=0;
让大小=v.len();
适用于&v\u输入&v{
n1=v_i;
cnt=cnt+1;
对于cnt中的i..尺寸{
如果(n1+*v.get(i).unwrap())==2020{
n2=*v.get(i).unwrap();
返回(n1,n2);
}
}
}
(n1,n2)
}
这也是您可以返回并使用的最佳情况。因此,不返回
(i32,i32)
,而是返回
选项

除了执行
*v.get(i).unwrap()
,您还可以只执行以下操作

fn查找编号\u 2020(v:Vec)->选项{
设mut-cnt=0;
用于&n1输入&v{
cnt+=1;
对于cnt中的i..v.len(){
如果(n1+v[i])==2020{
设n2=v[i];
返回一些((n1,n2));
}
}
}
没有一个
}
fn main(){
// ...
如果让一些((n1,n2))=结果{
println!(“{}+{}={}”,n1,n2,n1+n2);
println!(“{}*{}={}”,n1,n2,n1*n2);
}
}
您可以在第一个循环中使用,而不是手动递增索引,然后在第二个循环中使用返回的索引

fn查找编号\u 2020(v:Vec)->选项{
对于v.iter()中的(i,&n1)枚举(){
对于v.iter()中的&n2。跳过(i+1){
如果(n1+n2)==2020{
返回一些((n1,n2));
}
}
}
没有一个
}

与其使用
v:Vec
,不如使用切片,即
v:&[i32]
。在
main()。请对我放松点(跟你提到的一样多的错误,但是我能把它清理干净。非常感谢你的解释,我不知道返回的语句是这样工作的!”数学压倒了我很高兴能帮上忙。如果我的答案解决了你的问题,请考虑通过点击答案得分下面的灰色勾选来接受它,谢谢!w在这里!太好了,建议!我一直很感激提示和学习机会,谢谢你!@Overbeddedby Math不客气,很高兴我能帮忙:)