预期的枚举`std::result::Result`,发现结构`std::vec::Vec`。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了预期的枚举`std::result::Result`,发现结构`std::vec::Vec`。相关的知识,希望对你有一定的参考价值。

我想写一个函数,接受一个整数,找到除数,然后返回一个包含这些值的向量。我总是得到这个错误 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>`
答案

这里的问题是,你在函数结尾提供的返回值的类型是 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 不会隐式地在这些类型之间转换,所以我们需要改变这两种类型中的一种来使它们一致。

以上是关于预期的枚举`std::result::Result`,发现结构`std::vec::Vec`。的主要内容,如果未能解决你的问题,请参考以下文章

Rust Diesel 原始 SQL 给出错误“`std::result::Result<Vec<T>,diesel::result::Error>` 所需的类型注释”

从C++转向Rust:两大主题值得关注!

匹配内部可变枚举的预期方法是啥?

预期的错误类,接口,枚举[关闭]

枚举映射附加约束的条件类型

如何修复“枚举约束失败”?