gpt4 book ai didi

rust - 就地转换结果

转载 作者:行者123 更新时间:2023-11-29 08:23:36 26 4
gpt4 key购买 nike

我有以下代码:

/// An error that encapsulates all possible configuration errors.
#[derive(Debug)]
pub enum Error {
/// An error that occured while parsing a yaml configuration.
Yaml(serde_yaml::Error),
}

impl From<serde_yaml::Error> for Error {
fn from(err: serde_yaml::Error) -> Error {
Error::Yaml(err)
}
}

/// A `Result` type alias for this config module's `Error` type.
pub type Result<T> = ::std::result::Result<T, Error>;

pub fn new(mut args: env::Args) -> Result<Config, Error> {
// initialize config_file variable
let config = serde_yaml::from_reader(config_file)?;
Ok(config)
}

serde_yaml::from_reader 返回一个 serde_yaml::Result,它使用 serde_yaml::Error 作为 Result的错误类型。上面的代码编译得很好。

也就是说,我应该解开调用 serde_yaml::from_reader 返回给我的 Result 然后立即重新打包到一个新的 Ok。换句话说,我真的很想能够写:

pub fn new(mut args: env::Args) -> Result<Config> {
// initialize config_file variable
serde_yaml::from_reader(config_file)
}

但是当我尝试这样做时,出现以下编译器错误:

error[E0308]: mismatched types
--> src/config.rs:28:9
|
18 | pub fn new(mut args: env::Args) -> Result<Config> {
| -------------- expected `std::result::Result<config::Config, config::Error>` because of return type
...
28 | serde_yaml::from_reader(config_file)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `config::Error`, found struct `serde_yaml::Error`
|
= note: expected type `std::result::Result<config::Config, config::Error>`
found type `std::result::Result<_, serde_yaml::Error>`

这里发生了什么,在这种情况下最惯用的做法是什么?我应该让我的代码保持原样吗?

最佳答案

您有两种不同的错误类型。不同类型不兼容。仅此而已。

值得注意的是,您只是“重新包装”该值;您正在将初始 Result 值分开,进行错误类型的转换,如果出现错误则从函数中分支出来,然后将值重新包装到不同的 Result 类型。另外,您甚至不需要那里的变量;你同样可以把它写成 Ok(serde_yaml::from_reader(config_file)?)

如果你真的不想使用?Ok,你可以用另一种方式进行错误转换:

serde_yaml::from_reader(config_file)
.map_err(|e| e.into())

但这本质上是一样的,只是没有“出错时提前返回”部分。

关于rust - 就地转换结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49218306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com