为什么在尝试连接Rust中的Postgres时无法编译以下内容

时间:2014-07-28 10:25:11

标签: postgresql rust

尝试连接Postgres时,以下行与文档

一样有效
let conn = PostgresConnection::connect("postgres://postgres@localhost",
                                       &NoSsl).unwrap();

但是一旦我改变了这个:

let conn = try!(PostgresConnection::connect("postgres://postgres@localhost", &NoSsl));

我收到以下编译错误:

<std macros>:2:59: 2:65 error: mismatched types: expected `()` but found `core::result::Result<<generic #16>,postgres::error::PostgresConnectError>` (expected () but found enum core::result::Result)
<std macros>:2     ($e:expr) => (match $e { Ok(e) => e, Err(e) => return Err(e) })

1 个答案:

答案 0 :(得分:3)

try!()宏转换此代码:

let conn = try!(PostgresConnection::connect("postgres://postgres@localhost", &NoSsl));

进入这个:

let conn = match PostgresConnection::connect("postgres://postgres@localhost", &NoSsl) {
    Ok(e) => e,
    Err(e) => return Err(e)
};

也就是说,如果出现错误,它将从调用它的函数返回。因此,此函数必须返回Result<..., PostgresConnectError>类型的函数。但是,在你的情况下,你正在调用这个宏的函数似乎没有返回任何东西(也就是说,它返回单位()fn whatever() { } - 没有返回类型)。

另一方面,如果结果值为Result::unwrap()

Err导致任务失败,并且它是一个函数,因此它不依赖于函数返回类型。