我有以下对象,并尝试转换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>
和/或Display
for CourseName
,使所有内容更通用。
假设这CourseName
只是有一个类型化的版本而不是String
. 然后你可以改为 impl 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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句