Number/Types 个参数不匹配

Mismatch in Number/Types of Arguments

这个

extern crate postgres;

use postgres::{Connection, SslMode};

struct User {
    reference: String,
    email: String,
    firstname: String,
    lastname: String
}

static DB_URI: &'static str = "postgres://postgres:postgres@localhost/test";

fn main() {

    let conn = Connection::connect(DB_URI, &SslMode::None).unwrap();
    let trans = conn.transaction().unwrap();

    //...

}

fn insert_user<'a>(trans: &'a postgres::Transaction, user: &User) -> &'a postgres::Result {
    //...
}

正在抛出错误

error: wrong number of type arguments: expected 1, found 0 [E0243]
fn insert_user<'a>(trans: &'a postgres::Transaction, user: &User) -> &'a postgres::Result {
                                                                         ^~~~~~~~~~~~~~~~

这里缺少什么?我只想 return 执行查询的结果。

UPDATE 所以我把函数行修改成这样:

fn insert_user(trans: &postgres::Transaction, user: &User) -> &postgres::Result<()> {

欺骗编译器显示正确的 return 类型,它给了我这个:

mismatched types:
 expected `core::result::Result<(), postgres::error::Error>`,
    found `core::result::Result<postgres::Rows<'_>, postgres::error::Error>`

然而,当我尝试像这样匹配 return 类型时:

fn insert_user(trans: &postgres::Transaction, user: &User) -> &postgres::Result<postgres::Rows<'_>, postgres::error::Error> {

它现在抛出一个新错误:

error: use of undeclared lifetime name `'_` [E0261]
fn insert_user(trans: &postgres::Transaction, user: &User) -> postgres::Result<postgres::Rows<'_>, postgres::error::Error> {
                                                                                              ^~

Result 定义为 postgres::Result<T>(我们说它在 T 上是 泛型)。根据 insert_user 函数的内部结构,它可能是 Result<bool>Result<u64>Result<()> 或其他东西。

例如,execute 方法在 Transaction returns 和 Result<u64> 上,因此这是一个可能的变体。

查看包装箱 postgresdocumentation,我们可以看到类型 postgres::Result 在一个类型参数上是通用的:

type Result<T> = Result<T, Error>;

通常你会有两个选择:

  1. 如果您知道它是什么,请自行指定类型:postgres::Result<MyType>
  2. 让编译器为您推断(如果它在其他地方有足够的信息):postgres::Result<_>

但是在 return 类型中(-> 之后的类型)不会触发类型推断,因此只有选项 1. 可用。

(提示:您仍然有一个技巧可以找出所需的类型。您可以尝试指定单位类型:... -> postgres::Result<()> 并检查编译器是否报错 "expected MyType, found ()"。这意味着你要指定 ... -> postgres::Result<MyType>。)