Ожидается перечисление `std :: result :: Result`, найдена структура` std :: ve c :: Vec` - PullRequest
0 голосов
/ 16 июня 2020

Я хочу написать функцию, которая принимает целое число, находит делители и возвращает вектор с этими значениями. Я всегда получаю эту ошибку expected enum std::result::Result, found struct `std::vec::Vec`. Почему так происходит? Как предотвратить это сейчас и в будущем?

fn main() {
    println!("{:?}", run(24));
}

pub fn run(integer: i32) -> Result<Vec<u32>, String> {
    let mut v: Vec<i32> = vec![];

    for i in 2..integer {
        if integer % i == 0 {
            v.push(i);
        }
    }
    v
}

Вот ошибка:

error[E0308]: mismatched types
  --> src/main.rs:13:5
   |
5  | pub fn run(integer: i32) -> Result<Vec<u32>, String> {
   |                             ------------------------ expected `std::result::Result<std::vec::Vec<u32>, std::string::String>` because of return type
...
13 |     v
   |     ^ expected enum `std::result::Result`, found struct `std::vec::Vec`
   |
   = note: expected enum `std::result::Result<std::vec::Vec<u32>, std::string::String>`
            found struct `std::vec::Vec<i32>`

1 Ответ

1 голос
/ 17 июня 2020

Проблема здесь в том, что возвращаемое значение, которое вы предоставляете в конце функции, имеет тип Vec<i32>, тогда как вы объявили функцию для возврата значения типа Result<Vec<u32>, String>, что не то же самое. Система типов Rust довольно строгая и не будет неявно вставлять здесь преобразование. Вы можете использовать конструктор Ok для преобразования вашего Vec<i32> в Result<Vec<i32>, String>, например:

pub fn run(integer: i32) -> Result<Vec<u32>, String> {
    let mut v: Vec<i32> = vec![];

    for i in 2..integer {
        if integer % i == 0 {
            v.push(i);
        }
    }
    Ok(v)
}

Теперь это даст другую ошибку:

error[E0308]: mismatched types
  --> src/main.rs:13:8
   |
13 |     Ok(v)
   |        ^ expected `u32`, found `i32`
   |
   = note: expected struct `std::vec::Vec<u32>`
              found struct `std::vec::Vec<i32>`

Там по-прежнему несовпадение типов, потому что объявленный возвращаемый тип включает u32, тогда как предоставленное значение включает i32. Опять же, Rust не будет выполнять неявное преобразование между этими типами, поэтому нам нужно будет изменить один из двух типов, чтобы они согласовались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...