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>
上,因此这是一个可能的变体。
查看包装箱 postgres
的 documentation,我们可以看到类型 postgres::Result
在一个类型参数上是通用的:
type Result<T> = Result<T, Error>;
通常你会有两个选择:
- 如果您知道它是什么,请自行指定类型:
postgres::Result<MyType>
- 让编译器为您推断(如果它在其他地方有足够的信息):
postgres::Result<_>
但是在 return 类型中(->
之后的类型)不会触发类型推断,因此只有选项 1. 可用。
(提示:您仍然有一个技巧可以找出所需的类型。您可以尝试指定单位类型:... -> postgres::Result<()>
并检查编译器是否报错 "expected MyType
, found ()
"。这意味着你要指定 ... -> postgres::Result<MyType>
。)
这个
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>
上,因此这是一个可能的变体。
查看包装箱 postgres
的 documentation,我们可以看到类型 postgres::Result
在一个类型参数上是通用的:
type Result<T> = Result<T, Error>;
通常你会有两个选择:
- 如果您知道它是什么,请自行指定类型:
postgres::Result<MyType>
- 让编译器为您推断(如果它在其他地方有足够的信息):
postgres::Result<_>
但是在 return 类型中(->
之后的类型)不会触发类型推断,因此只有选项 1. 可用。
(提示:您仍然有一个技巧可以找出所需的类型。您可以尝试指定单位类型:... -> postgres::Result<()>
并检查编译器是否报错 "expected MyType
, found ()
"。这意味着你要指定 ... -> postgres::Result<MyType>
。)