如何将 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);
}
您需要做的就是 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();
我有以下对象,并尝试转换 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);
}
您需要做的就是 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();