Проблема здесь в том, что возвращаемое значение, которое вы предоставляете в конце функции, имеет тип 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 не будет выполнять неявное преобразование между этими типами, поэтому нам нужно будет изменить один из двух типов, чтобы они согласовались.