【问题标题】:get element from Vec that tell me could not move in rust从 Vec 获取元素,告诉我不能在生锈中移动
【发布时间】:2021-12-19 09:27:07
【问题描述】:

我正在学习使用 rust 来做一些工作。我正在使用此代码在 rust 中从 Vec 中查找元素:

let filtered_music:Vec<Music> = musics.iter()
            .filter(|item| item.source_id == fav.source_id)
            .collect();

下一步我想把他的元素放到另一个对象上:

let curr_music = &filtered_music[0];
let fav_resp = FavMusicResponse{
    id: (&fav.id.to_string()).parse().unwrap(),
    song_id: None,
    created_time: 0,
    updated_time: 0,
    user_id: 0,
    source_id: fav.source_id.to_string(),
    like_status: 0,
    source: 0,
    playlist_id: 0,
    play_count: 0,
    fetched_download_url: None,
    downloaded: None,
    music: curr_music
};

但是编译器告诉我预期的Music,发现&amp;Music,我应该怎么做才能修复它?这是我关于这个问题的最小示例,可以在https://play.rust-lang.org/ 中运行以重现这种情况:

fn main() {
    println!("Hello, world!");
    let musics:Vec<Music> = Vec::new();
    let filtered_music:Vec<&Music> = musics.into_iter()
            .filter(|item| item.source_id == "1")
            .collect();
    let resp = MusicRes{
        music: filtered_music[0]
    };
}


pub struct Music {
    pub id: i64,
    pub name: String,
    pub artists: String,
    pub album_id: i64,
    pub publishtime: i64,
    pub status: i32,
    pub duration: i32,
    pub source_id: String,
    pub source: i32,
    pub created_time: i64,
    pub updated_time:i64,
    pub album: String,
    pub fetched_download_url: i32
}

pub struct MusicRes {
    pub music:Music
}

【问题讨论】:

  • 您可能希望使用into_iter 而不是iter。这可能会有所帮助stackoverflow.com/a/57697614/1418750
  • into_iter 仍然没有解决这个问题。 @Njuguna Mureithi 错误保持不变。
  • 能否提供更完整的代码示例,尤其是可以使用play.rust-lang.org调试的代码示例
  • 如何在https://play.rust-lang.org/@Njuguna Mureithi 中添加依赖项 我没有找到cargo.toml
  • 我做了一个最小的复制示例。@Njuguna Mureithi

标签: rust


【解决方案1】:

以下是主要变化

fn take<T>(mut vec: Vec<T>, index: usize) -> Option<T> {
    if index < vec.len() {
        Some(vec.swap_remove(index))
    } else {
        None
    }
}
fn main() {
    println!("Hello, world!");
    let musics: Vec<Music> = Vec::new();
    let filtered_music: Vec<Music> = musics
        .into_iter()
        .filter(|item| item.source_id == "1")
        .collect();
    let resp = MusicRes {
        music: take(filtered_music, 0).unwrap(),
    };
}

编辑

如果您只想要音乐矢量的第一个元素,请考虑在过滤后使用.next()。这将避免take 函数。

我的回答是基于这个answer

这是一个工作示例:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=6d4137ccb7f737fa6261ea8c27bd012b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多