我这个小程序,但我不能让它运行。我在&str
和String
或类似错误之间出现类型不匹配。
所以这是程序
use std::fs::File;
use std::io;
use std::io::prelude::*;
use std::io::BufReader;
use std::collections::HashMap;
fn main() {
let mut f = File::open("/home/asti/class.csv").expect("Couldn't open file");
let mut s = String::new();
let reader = BufReader::new(f);
let lines: Result<Vec<_>,_> = reader.lines().collect();
let mut class_students: HashMap<String, Vec<String>> = HashMap::new();
for l in lines.unwrap() {
let mut str_vec: Vec<&str> = l.split(";").collect();
println!("{}", str_vec[2]);
let e = class_students.entry(str_vec[2]).or_insert(vec![]);
e.push(str_vec[2]);
}
println!("{}", class_students);
}
我经常遇到这个错误:
hello_world.rs:20:38: 20:48 error: mismatched types:
expected `collections::string::String`,
found `&str`
(expected struct `collections::string::String`,
found &-ptr) [E0308]
hello_world.rs:20 let e = class_students.entry(str_vec[2]).or_insert(vec![]);
^~~~~~~~~~
我尝试更改行
let mut str_vec: Vec<&str> = l.split(";").collect();
到
let mut str_vec: Vec<String> = l.split(";").collect();
但我收到了这个错误:
hello_world.rs:16:53: 16:60 error: the trait `core::iter::FromIterator<&str>` is not implemented for the type `collections::vec::Vec<collections::string::String>` [E0277]
hello_world.rs:16 let mut str_vec: Vec<String> = l.split(";").collect();
那么如何从String
而不是l
中提取&str
?此外,如果有更好的解决方案,请告诉我,因为我对这项技术的新兴可能对所有人都很明显。
答案 0 :(得分:5)
比评论更详细的答案:
您的示例最初无法编译的原因是您尝试将切片插入到字符串向量中。因为基本类型str
实现了ToString
特征,所以可以调用to_string()
方法将其转换为字符串,从而为向量提供正确的类型。
另一个选项是to_owned()
,如this主题中所示。