首页 > 解决方案 > Rust 中迭代和操作的最佳/惯用方式是什么

问题描述

您好,我有这段代码:

let mut quotations: Vec<CreateQuotationArgs> = Vec::new();
let mut insert_documents = Vec::new();
while let bson::Bson::Document(document) = bson::to_bson(&quotations.pop()).unwrap() {
    insert_documents.push(document);
}

我想执行相同的操作(在文档 BSON 中加上引号),但不使用pop()方法来保持quotations向量填充。

我知道我可以使用map()iter()方法,但这是最好的方法吗?

标签: loopsrustiteration

解决方案


“最佳”是相当加载。如果没有更广泛的背景,很难正确回答这个问题。

以下等效于您的原始代码(假设您不关心订单),但不删除项目quotations

let quotations: Vec<CreateQuotationArgs> = Vec::new();
let mut insert_documents = Vec::new();

for quotation in &quotations {
    if let bson::Bson::Document(document) = bson::to_bson(quotation).unwrap() {
        insert_documents.push(document);
    } else {
        break;
    }
}

一种更惯用的方法是不改变任何向量,而是将结果收集到一个新的向量中:

let quotations: Vec<CreateQuotationArgs> = Vec::new();

let insert_documents: Vec<_> = quotations
    .iter()
    .filter_map(|quotation| {
        if let bson::Bson::Document(document) = bson::to_bson(quotation).unwrap() {
            Some(document)
        } else {
            None
        }
    })
    .collect();

这并不完全相同,因为即使遇到不是Bson::Document. 它的好处是它避免了可变变量。


推荐阅读