Vector 如何转换向量<;项目>;至Vec<;字符串>;?

Vector 如何转换向量<;项目>;至Vec<;字符串>;?,vector,rust,visibility,private,map-function,Vector,Rust,Visibility,Private,Map Function,我有以下对象,正在尝试转换Vec并检索CourseName pub struct Schools { pub courses: Vec<CourseName>, } pub struct CourseName(String); impl CourseName { pub fn as_str(&self) -> &str { &self.0[..] } } pub-struct学校{ 酒吧课程:Vec, } p

我有以下对象,正在尝试转换
Vec
并检索
CourseName

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

pub struct CourseName(String);

impl CourseName {
    pub fn as_str(&self) -> &str {
        &self.0[..]
    }
}
pub-struct学校{
酒吧课程:Vec,
}
pub结构CourseName(字符串);
impl CourseName{
发布fn as_str(&self)->&str{
&self.0[…]
}
}
试图获取
Vec
,但我的以下方法不起作用

assigned_courses:Vec<String> = courses.iter().map(|c| c.clone().as_str()).collect()
assigned_courses:Vec=courses.iter().map(| c | c.clone().as_str()).collect()
获取以下错误:

无法从`std::iter::Iterator构建`Vec`类型的
值`
更新:

工作示例:

#[派生(调试)]
发布结构CourseName(发布字符串);
fn课程到字符串(列表:&[CourseName])->Vec{
list.iter().map(| course | course.0.clone()).collect()
}
fn main(){
让课程:Vec=Vec[
CourseName(“a.to_string()),
CourseName(“b”。到_字符串())
];
让strings=courses\u到\u strings(&courses);
dbg!(字符串);
}


您所需要做的就是
克隆
字符串
而不是
map
函数中的
CourseName
元组结构,还可以将
pub
可见性修饰符添加到内部
字符串

映射
闭包接收
&CourseName
以便
克隆
只复制引用。相反,您需要的是访问元组并使用
c.0
克隆内部
字符串

let assigned_courses:Vec=courses.iter().map(|c | c.0.clone()).collect();
或者,如果对课程名称的引用足够多,则可以在内部字符串上使用
as_str

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

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

pub-struct-CourseName(发布字符串);
但是,最好将其保持为私有,并添加一个类似
的方法作为\u str()

impl-CourseName{
发布fn as_str(&self)->&str{
&self.0
}
}
然后导致:

let assigned_courses:Vec=schools.courses.iter().map(|c | c.as_str().to_string()).collect();
或者,您也可以impl和/或for
CourseName
,使所有内容更加通用化


假设
CourseName
只是有一个键入的版本,而不是
字符串。然后您可以改为impl for
CourseName

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

pub struct CourseName(String);

impl CourseName {
    pub fn as_str(&self) -> &str {
        &self.0[..]
    }
}
使用std::fmt;
pub结构CourseName(字符串);
impl fmt::CourseName的显示{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
写!(f,“{}”,self.0)
}
}
这允许您执行
println!(“{},course”)
以及
course.to_string()

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

我得到类型的
Vec`不能从
std::iter::Iterator构建
注意,我添加了
.0
并删除了
as_str()
我遇到了一个问题,相应地更新了我的问题。我相应地更新了我的问题,实际上我有
as_str()
方法,但它略有不同,我怎样才能处理你的解决方案呢。对不起,我是铁锈的新手,还在学习。@vallentin感谢无数次帮助学习铁锈的人。我真的很感谢你的努力和时间。你不仅帮助了我,还教了我一些很酷的技巧。我希望我能投更多的票!祝你周末愉快!获取以下错误`类型为
Vec
的值无法从
std::iter::Iterator
生成您是否转到游乐场链接并运行代码?它的编译和运行都很好。很难回答您的问题,因为它没有包含一个。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。如果您试图重现您的错误(如果可能的话),或者在全新的货运项目中,那么我们将更容易帮助您,然后您的问题将包括附加信息。您可以使用以下方法减少在此处发布的原始代码。谢谢请回答您的问题,并粘贴您得到的准确和完整的错误-这将帮助我们了解问题所在,以便我们能够提供最好的帮助。有时,试图解释错误消息是很棘手的,而这实际上是错误消息的另一个重要部分。请使用直接运行编译器的消息,而不是IDE生成的消息,IDE可能试图为您解释错误。