rust 返回Result&lt;(),Box &gt;是如何< dyn Error>工作的?

mwecs4sa  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(70)

我见过这样的代码:

use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
   Err("March")?
}

以及:

use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
   Err("March".into())
}

但我真的不明白他们是怎么工作的。据我所知,?就像一个早期返回,当我们遇到错误时立即返回。为什么需要Err("March")??为什么不只是Err("March"),因为它已经是函数的最后一个表达式了?
Err("March".into())对我来说更令人困惑。"March".into()返回什么?如果它已经返回了一个错误,为什么我们需要再次将它 Package 在Err()中?为什么这不会导致像Err(Err())这样的奇怪类型?

zf2sa74q

zf2sa74q1#

"March".into()有一个泛型类型,可以通过推理来解析。根据返回类型,该泛型类型被推断为Box<dyn Error>
问号操作符之所以有效,是因为它会去糖,最终在错误值上调用into()Err("March")?大致为

match Err("March") { Ok(val) => val, Err(e) => return Err(e.into()) }

实际的脱糖更复杂(主要是因为它还将处理例如,选项和结果),但大致看起来像上面。

相关问题