我见过这样的代码:

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()返回什么,如果它已经返回错误,为什么我们需要再次将其包装在Err()中?为什么这不会导致像Err(Err())这样的奇怪类型?

推荐答案

"March".into()具有可通过推理进行解析的泛型类型.该泛型类型根据返回类型推断为Box<dyn Error>.

问号运算符之所以有效,是因为它最终会对错误值调用into().Err("March")?大致变成

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

实际的go 糖化要复杂得多(主要是因为它还将处理选项和结果之间的转换),但大致类似于上面的内容.

Rust相关问答推荐

如何初始化match声明中的两个变量而不会激怒borrow 判断器?

为什么要在WASM库中查看Rust函数需要`#[no_mangle]`?

从特征实现调用函数的Rust惯用方法

为什么我可以跟踪以前borrow 过的变量?房主在哪里?

如何编写一个以一个闭包为参数的函数,该函数以另一个闭包为参数?

无法从流中读取Redis请求

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

正则表达式中的重叠匹配?(铁 rust 正则式发动机)

在Rust中,Box:ed struct 与普通 struct 在删除顺序上有区别吗?

为什么Rust不支持带关联常量的特征对象?

为什么我的trait 对象类型不匹配?

中文优化标题:跳出特定循环并返回一个值

如何从 rust 中的同一父目录导入文件

使用 lalrpop 在 rust 中解析由 " 引用的字符串

Rust:`sort_by` 多个条件,冗长的模式匹配

在 Rust 中使用 `SecTrustSettingsSetTrustSettings` 绑定导致 `errSecInternalComponent`

如何将切片推入数组?

BigUint 二进制补码

如何创建动态创建值并向它们返回borrow 的工厂?