Причина ожидаемой ошибки (), найдена структура `std :: ve c :: Vec` в Rust? - PullRequest
0 голосов
/ 20 марта 2020

Я новичок в программировании ржавчины. Я хотел реализовать сортировку слиянием с рекурсией. Вот мой код:

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 Ответ

4 голосов
/ 20 марта 2020

В Rust тип блока - это тип конечного выражения или (), если его нет. Также объединенные блоки должны быть того же типа, что и if{...} else if{...} else{...}. Без else тип возврата выражения if должен быть (), поскольку этот тип возвращается, когда выражение оценивается как ложное.

Кроме того, результат не является окончательным выражением в вашем коде. Вместо этого вам нужно использовать return. Также помните, что Vec::push требует изменяемой ссылки экземпляра (&mut self).

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