gpt4 book ai didi

error-handling - Option 的 map_err

转载 作者:行者123 更新时间:2023-12-03 08:09:11 25 4
gpt4 key购买 nike

所以 Result<T, E>有一个非常简洁的方法 map_err允许以功能方式处理错误:

use std::io::Result;
use std::error::Error;
use std::string::ToString;
use std::io;

fn init() -> Result<u32> { Ok(42) }

fn do_work(_data: u32) -> Result<()> { Err(io::Error::new(io::ErrorKind::Other, "IO Error!")) }

fn handle_error<E: Error + ToString>(error: E, message: &str) -> E {
eprintln!("{}: {}", message, error.to_string());
error
}

fn main() {
let _ = init()
.map_err(|e| handle_error(e, "Init error"))
.and_then(do_work)
.map_err(|e| handle_error(e, "Work error")); // "Work error: IO error"
}

处理 Option<T>::None 时使用相同的函数式风格会很酷:

use std::io::Result;
use std::error::Error;
use std::string::ToString;
use std::io;

fn init_opt() -> Option<u32> { Some(42) }

fn do_work_opt(_data: u32) -> Option<()> { None }

fn handle_none(message: &str) {
eprintln!("{}", message);
}

fn main() {
let _ = init_opt()
.map_none(|| handle_none("Init error"))
.and_then(do_work_opt)
.map_none(|| handle_none("Work error")); // "Work error"
}

但我在 documentation of Option 中没有看到任何合适的替代方法

可以用这样的自定义特征来完成

trait MapNone {
fn map_none(self, op: impl FnOnce() -> ()) -> Self;
}

impl<T> MapNone for Option<T> {
fn map_none(self, op: impl FnOnce() -> ()) -> Self {
if self.is_none() { op(); }
self
}
}

但我确定我遗漏了一些东西,并且有一些很好的方法可以通过标准库来做同样的事情。

Full Playground

最佳答案

Option::or_else 函数存在,它是您所提议内容的通用形式。它不要求它的函数返回单位类型,而是返回一个 Option,因此只需让它返回 None 即可模拟您的用例。

fn main() {
let _ = init_opt()
.or_else(|| {handle_none("Init error"); None})
.and_then(do_work_opt)
.or_else(|| {handle_none("Work error"); None}); // "Work error"
}

当然现在也可以返回 Some(x) 而不是不同的分支。

最后,or_elseand_then也可以和map_or_else结合使用:

fn main() {
let _ = init_opt()
.map_or_else(|| {handle_none("Init error"); None}, do_work_opt)
.or_else(|| {handle_none("Work error"); None}); // "Work error"
}

这段代码应该和上面的一样; map_or_else 分支取决于选项是 None 还是包含一个值。

关于error-handling - Option<T> 的 map_err,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63206012/

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