rust - 错误处理、map_err 和错误类型转换

我正在学习 Rust,目前正在做练习 here .

到目前为止,我已经想出了以下内容:

impl ParsePosNonzeroError {
   ...
   ...
   fn from_parseint(err: ParseIntError) -> ParsePosNonzeroError {
       ParsePosNonzeroError::ParseInt(err)
   }
fn parse_pos_nonzero(s: &str)
-> Result<PositiveNonzeroInteger, ParsePosNonzeroError>
{
     let x: i64 = s.parse::<i64>().map_err(ParsePosNonzeroError::from_parseint);
     PositiveNonzeroInteger::new(x).map_err(ParsePosNonzeroError::from_creation)
}

当我这样做时,我收到错误消息:

! Compiling of exercises/error_handling/errors6.rs failed! Please try again. Here's the output:
error[E0308]: mismatched types
  --> exercises/error_handling/errors6.rs:34:18
   |
34 |       let x: i64 = s.parse::<i64>()
   |  ____________---___^
   | |            |
   | |            expected due to this
35 | |         .map_err(ParsePosNonzeroError::from_parseint);
   | |_____________________________________________________^ expected `i64`, found enum `Result`
   |
   = note: expected type `i64`
              found enum `Result<i64, ParsePosNonzeroError>`

浏览 map_err 的文档我看到以下内容: Maps a Result<T, E> to Result<T, F> by applying a function to a contained Err value, leaving an Ok value untouched.

我错过了什么?为什么这不起作用?

最佳答案

map_err正在返回 Result<i64, ParsePosNonzeroError>但你正试图将其影响到 x ,您将其声明为 i64多变的。您需要添加一个 ?这样一个Err将返回结果和 Ok结果将被展开:let x = s.parse::<i64>().map_err(ParsePosNonzeroError::from_parseint)?;

https://stackoverflow.com/questions/70553721/

相关文章:

websocket - 将 Nextjs 部署到 Vercel 的 SocketIO,套接字未连接

r - 如何将多列连接成一列并删除重复项?

python - 绕过欧盟同意请求

c++ - 自动占位符类型和显式模板类型在 C++20 中是否等效?

powershell - 对 Powershell 脚本中的所有错误调用函数

c# - 如何将字符串拆分为包含前一个最后一个字符的两个字符的字符串数组?

c++ - 这个 'for' 循环与键盘记录器有什么关系?

firebase - argumnet 类型 'Null Funcion(DataSnapshot)

python - Julia 重新编码未定义

javascript - 如何在 react 中更改 useState 的对象值?