我有一个Rocket.ars服务器,在它的一个路径中,我调用一个函数来查找集合中的文档并对其进行循环.

查找集合的文档:

let participations: Cursor<Document> = collection.aggregate(pipeline, None).await.expect("Failed to fetch documents.");

现在在获取文档之后,它返回一个Cursor,然后我调用advance()在光标上循环.当在advance()的结果值上使用is_ok()而不是expect()时,会出现问题.

在这样做的时候,我的代码工作得很好,没有任何错误.

while participations.advance().await.expect("Failed to advance.") {
    let participation_doc = participations.deserialize_current();
}

但当我换成这个的时候.

while participations.advance().await.is_ok() {
    let participation_doc = participations.deserialize_current();
}

我的代码失败,并出现错误.

thread 'rocket-worker-thread' panicked at 'called `Option::unwrap()` on a `None` value'

经过调试,我发现拨打participations.deserialize_current();时会出现这个错误.它抛出一个错误,因为advance()调用不成功.但是如果advance()调用不成功103 should've returned 104,为什么首先执行我的循环.为什么我的代码在使用expect()时运行得很好.如果有错误,则105 should make my code panic.

我想要的是我的代码,即使advance()失败了也不会惊慌,这就是我使用is_ok()的原因.任何帮助都将不胜感激.

推荐答案

正如 comments 所指出的,您没有指定这个advance()调用来自哪个库,但我假设它来自MongoDB.

该方法的签名为:

pub async fn advance(&mut self) -> mongodb::error::Result<bool>;

因此,它是一个异步方法,它要么给你一个布尔值,要么给你一个MongoDB错误.正如doctor 所说:

返回值指示是否成功返回新结果(TRUE)或游标是否已关闭(FALSE).

通过等待,你得到的值是mongodb::error::Result<bool>.然后,在您的代码片段中使用它做两件不同的事情:

  • result.expect("Failed to advance.")(类似于result.unwrap())

    在这里,您说的是"假设没有MongoDB错误(或者是死机),然后判断是否有更多的值可用".

  • result.is_ok()

    在这里,您说的是"判断是否存在MongoDB错误".

请注意,在第二种情况下,您实际上没有使用布尔值.(编译器有没有警告过您这一点?)也许API可以设计得更好一些,但第一个变种稍微好一些.如果您还希望优雅地处理错误,则需要判断both是否没有MongoDB错误,以及Cursor中是否有更多可用值.

大概是这样的:

loop {
    match participations.advance().await {
        Ok(true) => {
            let participation_doc = participations.deserialize_current();
            todo!(); // do things with participation_doc ...
        }
        Ok(false) => break, // done with the collection
        Err(err) => todo!(), // handle err somehow
    }
}

Rust相关问答推荐

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

为什么父作用域中的变量超出了子作用域

有条件默认实现

无需通过ASIO输入音频,并使用cpal进行反馈示例

如何最好地并行化修改同一Rust向量的多个切片的代码?

如何创建引用构造函数拥有的变量的对象?

如果成员都实现特征,是否在多态集合上实现部分重叠的特征?

如果LET;使用布尔表达式链接(&Q);

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

允许 rust 迹 struct 条目具有多种类型

返回Result<;(),框<;dyn错误>>;工作

如何轮询 Pin>?

随机函数不返回随机值

Rust 中的静态引用

如何限制 GtkColumnView 行数

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

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

Rust,使用枚举从 HashMap 获取值

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

如何阅读 HttpRequest 主体