我有一个 Rust 程序,它有一个函数\n\xe2\x80\x98is_input_sanitized\xe2\x80\x99,它接受输入\n字符串 m,并检查输入是否不含特殊字符。该方法正在单独使用按以下方式运行。
\nlet a = match is_input_sanitized(m) {\n Ok(m) => m,\n Err(_) => { return Err("error"); },\n};\nRun Code Online (Sandbox Code Playgroud)\n我正在尝试将此片段转换为使用 \xe2\x80\x98unwrap_or_else\xe2\x80\x99 ,当输入未清理时,它将返回错误。我已阅读文档,但无法破译实现的正确方法这。这种转换可能吗?
\nunwrap_or_else用于提取Result值。在我看来,您不想提取结果,只想创建一个新结果并传播错误。您想在这里做两件不同的事情。第一个是您想要将错误从它开始的任何内容(由您_在模式匹配中指示)更改为您可以控制的内容,第二个是您想要return错误。
可以使用 来替换错误,它接受一个函数(例如闭包),如果是一个map_err,则将该函数应用于错误。如果结果为,则返回当前未修改的值。ResultErrOkResult
第二个问题,返回Err,正是发明问号运算符的目的。
使用 match 链接结果可能会变得非常混乱;幸运的是,
?可以使用该运算符使事情再次变得美好。?用在返回 a 的表达式的末尾Result,相当于匹配表达式,其中Err(err)分支扩展为 Earlyreturn Err(From::from(err)),并且Ok(ok)分支扩展为表达式ok。
所以你要找的是
let a = is_input_sanitized(m).map_err(|_| "error")?;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4442 次 |
| 最近记录: |