如何使rust列表在运行迭代器后不被删除



我在rust中传递了一个vec参数给函数:

pub fn songs(playlist_records: Vec<QueryFavorites>) -> Vec<MusicResponse> {
}

第一步,我从playlist_records获得id来执行查询,这是代码:

let ids: Vec<String> = playlist_records
.into_iter()
.map(|item| item.source_id.to_string())
.collect();

当我使用playlist_records第二次获取字段后获得查询结果:

for query_song in &results {
let favTime: Vec<QueryFavorites> = playlist_records
.into_iter()
.filter(|item| item.source_id == query_song.source_id)
.collect();
}

告诉我playlist_records被移动了。这是消息:

`playlist_records` moved due to this method call, in previous iteration of loop

我试着像这样借playlist_records:

let ids: Vec<String> = &playlist_records
.into_iter()
.map(|item| item.source_id.to_string())
.collect();

似乎不起作用,我应该怎么做才能重用playlist_records?

into_iter更改为使用iter,因为into_iter使用集合,而iter通过引用迭代而不使用集合,这里查看更多关于差异的信息:

游乐场

let ids: Vec<String> = playlist_records
.iter()
.map(|item| item.source_id.to_string())
.collect();
let favTime: Vec<&QueryFavorites> = playlist_records
.iter()
.filter(|item| item.source_id == "someid")
.collect();

这意味着你的favTime将是Vec<&QueryFavorites>类型,如果这对你来说很好。否则,你可以克隆迭代器。

let favTime: Vec<QueryFavorites> = playlist_records
.iter()
.cloned()
.filter(|item| item.source_id == "someid")
.collect();

游乐场

最新更新