loops - 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
. 它的好处是它避免了可变变量。
推荐阅读
- excel - 频率表的 Excel 公式
- javascript - 选择选项多值提取
- vhdl - 移位寄存器 PISO
- javascript - 如何使用 javascript 数组进行反应选择选项
- c - 整数数组中元素的不同打印输出
- java - 我可以在 Spring WebFlux 上实现 WebSecurityConfigurerAdapter
- sql-server - SQL查询在转换unix时间戳int值时查找过去24小时内的数据
- python - 谷歌 BigQuery API Python
- python - 由于 Mac 10.11.6 上缺少 Python3.6,QGIS 3 中的 GDAL 合并错误
- php - 如何接收相机数据以上传到android中的php服务器