如何将 Vec<Item> 转换为 Vec<String>?

How to convert Vec<Item> to Vec<String>?

我有以下对象,并尝试转换 Vec<Courses> 并检索 CourseName

pub struct Schools {
    pub courses: Vec<CourseName>,
}

pub struct CourseName(String);

impl CourseName {
    pub fn as_str(&self) -> &str {
        &self.0[..]
    }
}

正在尝试获取 Vec<String>,但我的以下方法不起作用,

assigned_courses:Vec<String> = courses.iter().map(|c| c.clone().as_str()).collect()

出现以下错误:

value of type `Vec<std::string::String>` cannot be built from `std::iter::Iterator<Item=&str>`

更新:

工作示例:

#[derive(Debug)]
pub struct CourseName(pub String);

fn courses_to_strings(list: &[CourseName]) -> Vec<String> {
    list.iter().map(|course| course.0.clone()).collect()
}

fn main() {
    let courses: Vec<CourseName> = vec![
        CourseName("a".to_string()),
        CourseName("b".to_string())
    ];
    let strings = courses_to_strings(&courses);
    dbg!(strings);
}

playground

您需要做的就是 clone String 而不是 map 函数中的 CourseName 元组结构,并添加 pub内部 String.

的可见性修饰符

map 闭包收到一个 &CourseName 所以 clone 只是复制引用。相反,您想要的是访问元组并使用 c.0.

克隆内部 String
let assigned_courses: Vec<String> = courses.iter().map(|c| c.0.clone()).collect();

或者,如果对课程名称的引用就足够了,那么您可以在内部字符串上使用 as_str

let assigned_courses: Vec<&str> = schools.courses.iter().map(|c| c.0.as_str()).collect();

修复“私有字段”错误。您可以添加可见性修饰符,例如

pub struct CourseName(pub String);

但是,最好将其保持为私有,而不是添加一个像 as_str().

这样的方法
impl CourseName {
    pub fn as_str(&self) -> &str {
        &self.0
    }
}

然后导致:

let assigned_courses: Vec<String> = schools.courses.iter().map(|c| c.as_str().to_string()).collect();

或者,您也可以为 CourseName 实现 AsRef<str> and/or Display,以使所有内容更加通用。


假设 CourseName 只是有一个打字版本而不是 String。然后你可以代替 Display for CourseName.

use std::fmt;

pub struct CourseName(String);

impl fmt::Display for CourseName {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}", self.0)
    }
}

这使您可以 println!("{}, course")course.to_string()

let assigned_courses: Vec<String> = schools.courses.iter().map(|c| c.to_string()).collect();