我见过这样的代码:
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())
这样的奇怪类型?
1条答案
按热度按时间zf2sa74q1#
"March".into()
有一个泛型类型,可以通过推理来解析。根据返回类型,该泛型类型被推断为Box<dyn Error>
。问号操作符之所以有效,是因为它会去糖,最终在错误值上调用
into()
。Err("March")?
大致为实际的脱糖更复杂(主要是因为它还将处理例如,选项和结果),但大致看起来像上面。