从函数返回内联定义的枚举?

时间:2014-09-02 07:47:47

标签: enums pattern-matching rust

我正在生锈,我正在尝试做这样的事情:

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

我试图找出一种定义发送功能的简洁方法。我看到了结果枚举,但它一次只处理一种错误。我希望我能像这样定义自己的枚举:

fn send(query: str) -> enum { Ok(Box<Response>), ConnError, DBError(str) } {
  ...
}
唉,这是不可能的,它抱怨意外的'enum'关键字。有没有办法做我在这里尝试的,或者可能使Result处理多种错误类型?谢谢!

1 个答案:

答案 0 :(得分: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!()
    }
}