【问题标题】:How can I return an error from Serde in a function that returns Result<() , Error>如何在返回 Result<() , Error> 的函数中从 Serde 返回错误
【发布时间】:2020-04-29 19:55:15
【问题描述】:

我正在尝试使用返回 Result&lt;(), Error&gt; 的函数从 Serde 返回错误:

use std::io::{Error};

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Mine {
    ab: u8,
    ac: u8,
}
#[macro_use]
extern crate serde_derive;

fn main() {
    if do_match().is_ok() {
        println!("Success");
    }
}

fn do_match() -> Result<(), Error> {
    match serde_json::from_str::<Mine>("test") {
        Ok(_e) => println!("Okay"),
        Err(e) => return e,
    }
    Ok(())
}

Rust Playground

经过各种尝试,我一直无法纠正问题返回错误,我该怎么办?

【问题讨论】:

    标签: rust serde rust-result


    【解决方案1】:

    首先,您使用了错误的错误类型。 serde_json::from_strErrserde_json::error::Error 类型,而您使用的是 std::io::Error。其次,通过在Err(e) 上进行模式匹配,然后尝试return e,您将不再返回Result,而是尝试仅返回serde_json::error::Error 类型的内容。相反,您应该返回Result&lt;(), serde_json::error::Error&gt;。这是完成您想要实现的目标的正确方法:

    fn do_match() -> Result <(), serde_json::error::Error> {
        serde_json::from_str::<Mine>("test").map(|_| println!("Okay"))
    }
    

    map 只会对来自serde_json::from_str 的结果执行println!(...),如果它是Ok 变体,否则它只会通过Err 变体。然后,您可以只返回结果表达式。

    Rust Playground

    【讨论】:

      猜你喜欢
      • 2019-01-04
      • 1970-01-01
      • 2021-04-26
      • 2021-05-30
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2021-03-07
      相关资源
      最近更新 更多