我收到了这条Ruust方法错误消息:

error[E0277]: the `?` operator can only be used on `Option`s,
not `Result`s, in an async function that returns `Option`

我必须承认,我经常遇到令我困惑的Rust错误消息,而对大多数其他程序员来说,它们是绝对有意义的.

所以,我提前为张贴这个问题道歉.

首先:错误消息中的第二个逗号是什么意思?我应该这样解读它吗?

如果[在另一个函数内]的异步函数调用返回类型Result的枚举,则?运算符只能应用if,且仅当相应的[其它]函数也返回Result类型的枚举而不是Option类型的枚举时

请原谅我的长篇大论.我希望我把我的观点讲明白了.

同样让我感到困惑的是具有相同引用的错误消息,即error[E0277],它列在official rust error codes index个国家中:

"您试图在需要某些特性的地方使用不实现某些特性的类型."

除了相同的标号外,这两个错误消息在哪个领域有任何共同之处?

下面是Rust生成的整个错误块:

error[E0277]: the `?` operator can only be used on `Option`s, not `Result`s, in an async function that returns `Option`
  --> src/utils/tokenizer.rs:72:73
   |
70 |       pub async fn clear(&self) -> Option<String> {
   |  _________________________________________________-
71 | |         let mut conn = self.pool.get().await.unwrap();
72 | |         let mut iter: redis::AsyncIter<i32> = conn.sscan("my_set").await?;
   | |                                                                         ^ use `.ok()?` if you want to discard the `Result<Infallible, Red
Error>` error information
73 | |         while let Some(element) = iter.next_item().await {
...  |
79 | |         Some(String::from("A"))
80 | |     }
   | |_____- this function returns an `Option`
   |
   = help: the trait `FromResidual<Result<Infallible, RedisError>>` is not implemented for `std::option::Option<std::string::String>`
   = help: the following other types implement trait `FromResidual<R>`:
             <std::option::Option<T> as FromResidual<Yeet<()>>>
             <std::option::Option<T> as FromResidual>

For more information about this error, try `rustc --explain E0277`.

典型的错误消息是什么?来自错误代码索引页的错误消息还是编译器生成的错误消息?

推荐答案

是的,你的解释是正确的,尽管这个错误说得很迂腐,但事实恰恰相反:

如果异步函数返回Option,则?运算符只能应用于类型为Option而不是Result的表达式.

如果您问这到底是为什么会有错误代码E0277?这是因为,为了使用?进行传播,类型必须使用类型参数的某种组合以及与函数的返回类型的某种其他组合相对应的关联类型来实现(实验性的)Try特征.因此,在本质上,?中的不兼容类型归结为不满意的特征界限.但除非你对?的内部工作原理感兴趣,否则这并不真正重要.

Rust相关问答推荐

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

MutexGuard中的过滤载体不需要克隆

如何计算迭代器适配器链中过滤的元素的数量

JSON5中的变量类型(serde)

Rust函数的返回值不能引用局部变量或临时变量

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

如何从宏调用闭包?

Rust 并行获取对 ndarray 的每个元素的可变引用

面临意外的未对齐指针取消引用:地址必须是 0x8 的倍数,但为 0x__错误

将多维数组转换为切片

为什么需要同时为值和引用实现`From`?方法不应该自动解引用或borrow 吗?(2023-06-16)

Rust typestate 模式:实现多个状态?

Rust 中 Mutex<> 的深拷贝?

从 HashMap>, _> 中删除的生命周期问题

类型判断模式匹配panic

Rust 中函数的类型同义词

改变不实现克隆的 dioxus UseState struct

当我不满足特征界限时会发生什么?

Rust 中的let是做什么的?

函数参数的 Rust 功能标志