首页 > 解决方案 > 运行迭代器后如何使生锈列表不被删除

问题描述

我将 vec 参数传递给 rust 中的函数,如下所示:

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

第一步,我从中获取 IDplaylist_records以执行查询,这是代码:

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

标签: listrust

解决方案


更改into_iter为 use 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();

操场


推荐阅读