首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使rust列表在运行迭代器后不被移除

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

Stack Overflow用户
提问于 2021-09-26 05:40:49
回答 1查看 57关注 0票数 1

我向rust中的函数传递了一个vec参数,如下所示:

代码语言:javascript
复制
pub fn songs(playlist_records: Vec<QueryFavorites>) -> Vec<MusicResponse> {
}

第一步,我从playlist_records获取I以执行查询,代码如下:

代码语言:javascript
复制
let ids: Vec<String> = playlist_records
        .into_iter()
        .map(|item| item.source_id.to_string())
        .collect();

在获取查询结果后,再次使用playlist_records获取字段时:

代码语言:javascript
复制
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被移动了。这就是信息:

代码语言:javascript
复制
`playlist_records` moved due to this method call, in previous iteration of loop

我试着像这样借用playlist_records

代码语言:javascript
复制
let ids: Vec<String> = &playlist_records
        .into_iter()
        .map(|item| item.source_id.to_string())
        .collect();

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-26 05:58:47

into_iter更改为使用iter,因为into_iter使用集合,而iter按引用迭代,并且不使用,请参阅关于the difference here的更多信息

playground

代码语言:javascript
复制
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>类型的。否则,您可以随时克隆迭代器。

代码语言:javascript
复制
let favTime: Vec<QueryFavorites> = playlist_records
  .iter()
  .cloned()
  .filter(|item| item.source_id == "someid")
  .collect();

playground

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69332170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档