2016-03-01 21 views
1

我這個小程序,但我不能讓它運行。我得到&strString之間的類型不匹配或類似的錯誤。str和字符串之間的不匹配

因此,這是程序

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

那麼,如何既提取l而不是&strString?另外,如果有更好的解決方案,請讓我知道,因爲我對這項技術的新用途可能很明顯。

+1

一個簡單的解決方案是調用'str_vec [2] .to_string()'。 – squiguy

+1

令人驚歎。我建議將其作爲答案,然後我可以接受它。這樣你,我會得到更多的積分 –

回答

5

更詳細的解答比評論:

你的榜樣未能最初編譯的原因是因爲你試圖插入一個切片成字符串的向量。由於原始類型str實現了ToString特徵,因此可以調用to_string()方法將其轉換爲字符串,從而爲您的向量提供正確的類型。

另一種選擇是to_owned(),如this線程所示。

+0

我忘了謝謝你之前。非常感謝!! –

+0

不客氣,快樂編碼。 – squiguy

相關問題