预期的枚举`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>` 所需的类型注释”