尝试连接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) })
答案 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
导致任务失败,并且它是一个函数,因此它不依赖于函数返回类型。