如何将 Vec<Item> 转换为 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>`

更新:

在此处输入图片说明

瓦伦丁

map封收到&CourseName这样clone只是复制参考。相反,您想要的是访问元组并String使用c.0.

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();

或者,您也可以 implAsRef<str>和/或Displayfor CourseName,使所有内容更通用。


假设这CourseName只是有一个类型化的版本而不是String. 然后你可以改为 impl Displayfor 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();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章