2014-09-02 40 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!() 
    } 
}