这里是生锈的新手,我无法将以下嵌套的for
循环转换为迭代器:
#![allow(unused)]
use std::io::Error;
fn main() {
let realms = vec!["realm".to_string()];
let auctions = get_auctions(&realms);
}
pub struct Auction;
pub struct RealmAuctionFile;
fn get_realm_auctions(file: &RealmAuctionFile) -> Result<Vec<Auction>, Error> {
let auctions = vec![Auction {}];
Ok(auctions)
}
fn get_realm_auction_files(realm: &str) -> Result<Vec<RealmAuctionFile>, Error> {
let files = vec![RealmAuctionFile {}];
Ok(files)
}
pub fn get_auctions(realms: &Vec<String>) -> Result<Vec<Auction>, Error> {
let mut auctions = vec![];
for realm in realms.iter() {
let files = get_realm_auction_files(realm)?;
for file in files.iter() {
let mut realm_auctions = get_realm_auctions(file)?;
auctions.append(&mut realm_auctions);
}
}
Ok(auctions)
}
pub fn get_auctions_with_iterator(realms: &Vec<String>) -> Result<Vec<Auction>, Error> {
let auctions = realms
.iter()
.flat_map(|realm| {
let realms_auctions: Vec<Auction> = get_realm_auction_files(realm)?
.iter()
.flat_map(|file| {
let auctions = get_realm_auctions(file)?;
Ok(auctions)
})
.collect();
Ok(realms_auctions)
})
.collect();
Ok(auctions)
}
我遇到两个错误:
error[E0277]: a collection of type `std::vec::Vec<Auction>` cannot be built from an iterator over elements of type `std::vec::Vec<Auction>`
--> src/main.rs:52:18
|
52 | .collect();
| ^^^^^^^ a collection of type `std::vec::Vec<Auction>` cannot be built from `std::iter::Iterator<Item=std::vec::Vec<Auction>>`
|
= help: the trait `std::iter::FromIterator<std::vec::Vec<Auction>>` is not implemented for `std::vec::Vec<Auction>`
error[E0277]: a collection of type `std::vec::Vec<Auction>` cannot be built from an iterator over elements of type `std::vec::Vec<Auction>`
--> src/main.rs:56:10
|
56 | .collect();
| ^^^^^^^ a collection of type `std::vec::Vec<Auction>` cannot be built from `std::iter::Iterator<Item=std::vec::Vec<Auction>>`
|
= help: the trait `std::iter::FromIterator<std::vec::Vec<Auction>>` is not implemented for `std::vec::Vec<Auction>`
此外,我无法将.unwrap()
与更惯用的?
答案 0 :(得分:0)
不要解开包装。而是生成Result
的迭代器,并利用Result
implements FromIterator
将其收集到Result<Vec>
中的事实。
另请参阅this answer。