2014-09-02 42 views
1

我潛入生鏽,和我試圖做這樣的事情:從函數返回內聯定義的枚舉?

match send("select * from User;") { 
    ConnError => println!("Connection error!"), 
    DBError(e) => println!("Database error {}", e), 
    Ok(response) => { 
    ... 
    } 
} 

,我試圖找出定義發送功能的緊湊方式。我看到了Result枚舉,但它一次只能處理一種錯誤。我希望我可以這樣定義自己的枚舉:

fn send(query: str) -> enum { Ok(Box<Response>), ConnError, DBError(str) } { 
    ... 
} 

唉,這是不可能的,它抱怨意外「枚舉」關鍵字。有什麼辦法來做我在這裏嘗試的,或者可能讓Result處理多種錯誤類型?謝謝!

回答

1

正如你所說,你可以使用Result,但你必須分別定義你的錯誤類型enum,因爲你不能直接在函數返回中定義它。 類似這樣的:

use std::rand::distributions::{IndependentSample, Range}; 

fn main() { 
    match send("select * from foo") { 
     Ok(Response) => println!("response"), 
     Err(e) => match e { 
       ConnError => println!("connection error"), 
       DbError(err) => println!("{}", err) 
      } 
    } 
} 

// the enum with your errors 
enum DataLayerError { 
    ConnError, 
    DbError(String) 
} 

struct Response; /*...*/ 

fn send(_query: &str) -> Result<Response, DataLayerError> { 
    let between = Range::new(0u, 2); 
    let mut rng = std::rand::task_rng(); 

    // return a random result 
    match between.ind_sample(&mut rng) { 
     0 => Ok(Response), 
     1 => Err(DbError("yikes".to_string())), 
     2 => Err(ConnError), 
     _ => unreachable!() 
    } 
}