如何解决在Rust中进行迭代和操作的最佳/理想方式是什么
let mut quotations: Vec<CreateQuotationArgs> = Vec::new();
let mut insert_documents = Vec::new();
while let bson::Bson::Document(document) = bson::to_bson("ations.pop()).unwrap() {
insert_documents.push(document);
}
我想执行相同的操作(在文档BSON中加引号),但不使用pop()
方法来保持quotations
矢量被填充。
我知道我可以使用map()
和iter()
方法,但这是最好的方法吗?
解决方法
“最佳”已加载完毕。没有更广泛的背景,很难正确回答这个问题。
以下内容等同于您的原始代码(假设您不关心订单),但是没有从quotations
中删除项目:
let quotations: Vec<CreateQuotationArgs> = Vec::new();
let mut insert_documents = Vec::new();
for quotation in "ations {
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
的项目,它也会继续解析项目。这样做的好处是它避免了可变变量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。