2015-01-12 21 views
2

我一直在修補Rust,我對函數返回類型有點困惑。作爲一個實驗,我正在編寫一個IRC日誌解析器。我熟悉原始類型,並使函數返回這些類型。返回多個數據時更復雜的類型怎麼辦?如何返回一個結構體或比原始體更復雜的東西?

/* Log line example from log.txt */ 
/* [17:35] <@botname> name1 [460/702] has challenged name2 [224/739] and taken them in combat! */ 

#[derive(Show)] 
struct Challenger { 
    challenger: String, 
    defender: String 
} 


fn main() { 
    let path = Path::new("log.txt"); 
    let mut file = BufferedReader::new(File::open(&path)); 
    for line in file.lines() { 
     let mut unwrapped_line = line.unwrap(); 
     let mut chal = challenges3(unwrapped_line); 
     println!("Challenger: {}", chal.challenger); 
     println!("Defender: {}", chal.defender); 
    } 
} 

fn challenges3(text: String)-> Challenger { 
    let s: String = text; 
    let split: Vec<&str> = s.as_slice().split(' ').collect(); 
    if(split[4] == "has" && split[5] == "challenged") { 
    let mychallenger = Challenger { challenger: split[2].to_string(), defender: split[6].to_string()}; 
    return mychallenger; 
    } 
} 

我意識到這個代碼不是很習慣,我對語言很熟悉。

我得到一個錯誤與此代碼:

"mismatched types: expected `Challenger`, found `()` (expected struct Challenger, found())" 

我怎樣才能返回一個結構或一個HashMap?有沒有更好的方法來返回多個數據字段?

回答

3

if in challenges3沒有else塊,所以如果條件不符合,在if塊之後繼續執行。這裏什麼也沒有,所以這個函數隱式返回()。您還必須在if塊或panic!之後返回Challenger以中止程序。

或者,您可以將函數的返回類型更改爲Option<Challenger>。返回在ifSome(mychallenger)Noneif塊之後:

fn challenges3(text: String) -> Option<Challenger> { 
    let s: String = text; 
    let split: Vec<&str> = s.as_slice().split(' ').collect(); 
    if split[4] == "has" && split[5] == "challenged" { 
     let mychallenger = Challenger { challenger: split[2].to_string(), defender: split[6].to_string()}; 
     return Some(mychallenger); 
    } 

    None 
} 

您還可以使用Result,而不是Option如果你想返回有關錯誤的信息。

+0

非常感謝!這有助於在此過程中清除一些事情。我相信我會在未來有更多的問題:) – Antiartificial

相關問題