当前位置: 首页 > 知识库问答 >
问题:

错误原因应为(),是否在Rust中找到结构“std::vec::vec”?

冉锋
2023-03-14

我对生锈编程是新手。我想用递归实现合并排序。这是我的代码:

fn merge(a: &mut Vec<u32>, b: &mut Vec<u32>) -> Vec<u32> {
    let mut temp: Vec<u32> = Vec::new();

    println!("The digit is {}", a[0]);
    while a.len() > 0 && b.len() > 0 {
        if a[0] > b[0] {
            temp.push(a[0]);
            a.pop();
        } else {
            temp.push(b[0]);
            b.pop();
        }
    }

    while a.len() > 0 {
        temp.push(a[0]);
        a.pop();
    }

    while b.len() > 0 {
        temp.push(b[0]);
        b.pop();
    }

    temp
}

fn merge_sort(v: &mut Vec<u32>) -> Vec<u32> {
    println!("The divided vector is: {:?}", v);
    let n = v.len();

    if n == 1 {
        println!("The divided vector is: {:?}", v.to_vec());
        let t: Vec<u32> = Vec::new();
        t.push(v[0]);
        t
    }

    if n == 0 {
        panic!("Alas!! NULL");
    }

    merge(
        &mut merge_sort(&mut v[0..n / 2].to_vec()),
        &mut merge_sort(&mut v[n / 2 + 1..n].to_vec()),
    )
    .to_vec()
}

fn main() {
    let mut v = vec![23, 78, 89, 64, 23, 12, 79, 45, 64];
    println!("The vector is: {:?}", v);
    println!("The length {}", v.len());

    let v = merge_sort(&mut v);

    println!("The sorted vector is: {:?}", v);
}

问题是,当我试图编译它时,我得到了以下错误:

error[E0308]: mismatched types
  --> src/main.rs:36:9
   |
32 | /     if n == 1 {
33 | |         println!("The divided vector is: {:?}", v.to_vec());
34 | |         let t: Vec<u32> = Vec::new();
35 | |         t.push(v[0]);
36 | |         t
   | |         ^ expected `()`, found struct `std::vec::Vec`
37 | |     }
   | |     -- help: consider using a semicolon here
   | |_____|
   |       expected this to be `()`
   |
   = note: expected unit type `()`
                 found struct `std::vec::Vec<u32>`

你知道我为什么会犯这个奇怪的错误吗!看来,我错过了什么。

共有1个答案

龙玺
2023-03-14

在Rust中,块类型是最终表达式的类型,如果没有,则为()。此外,组合块需要与if{...}fe if{...}fe{...}相同的类型。如果没有ore,if表达式的返回类型必须是(),因为这是表达式计算结果为false时返回的类型。

此外,结果不是代码中的最终表达式。您需要的是使用返回。还要注意,推送需要实例的可变引用(

if n == 1 {
    println!("The divided vector is: {:?}", v.to_vec());
    let mut t: Vec<u32> = Vec::new();
    t.push(v[0]);
    return t;
}

 类似资料: