gpt4 book ai didi

rust - 在 Rust 中使用 unwrap_or_else 进行错误处理

转载 作者:行者123 更新时间:2023-12-05 01:50:30 28 4
gpt4 key购买 nike

我有一个具有功能的 Rust 程序接受输入的‘is_input_sanitized’字符串 m,并检查输入是否没有特殊字符。该方法以下列方式在单独的函数上使用。

let a = match is_input_sanitized(m) {
Ok(m) => m,
Err(_) => { return Err("error"); },
};

我正在尝试将此代码段转换为使用“unwrap_or_else”,当输入未经过清理时,它将返回错误。我已阅读文档,但无法破译实现此目的的正确方法。这种转换可能吗?

最佳答案

unwrap_or_else 用于提取Result 值。在我看来,您不想提取 结果,而是想创建一个新结果并传播错误。你有两件不同的事情想在这里做。第一个是你想将错误从它开始的任何东西(由你的模式匹配中的 _ 指示)更改为你控制的东西,第二个是你想要 return 错误。

替换错误可以用map_err来完成,如果 ResultErr,它接受一个函数(例如闭包)并将该函数应用于错误。如果结果为 Ok,则返回未修改的当前 Result

第二个问题,返回Err,正是question mark operator发明的目的。

Chaining results using match can get pretty untidy; luckily, the ? operator can be used to make things pretty again. ? is used at the end of an expression returning a Result, and is equivalent to a match expression, where the Err(err) branch expands to an early return Err(From::from(err)), and the Ok(ok) branch expands to an ok expression.

所以你要找的是

let a = is_input_sanitized(m).map_err(|_| "error")?;

关于rust - 在 Rust 中使用 unwrap_or_else 进行错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73023600/

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