2015-06-11 162 views
2

不匹配參數

extern crate postgres; 

use postgres::{Connection, SslMode}; 

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

static DB_URI: &'static str = "postgres://postgres:[email protected]/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 { 
                     ^~~~~~~~~~~~~~~~ 

這到底是怎麼失蹤了?我只想返回執行查詢的結果。

UPDATE所以我修改了功能線是這樣的:

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

編譯器誘騙正確的返回類型,它給了我:

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

然而,當我試圖以匹配返回類型,如下所示:

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> { 
                           ^~ 
+2

這正是它說。你給了它錯誤的類型參數。 ['Result'](http://sfackler.github.io/rust-postgres/doc/v0.9.1/postgres/type.Result.html)採用返回的有效值的類型。 – Veedrac

回答

4

望着documentation的箱子postgres,我們可以看到,該型postgres::Result超過一個類型參數通用:

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

通常你有兩個選擇:

  1. 指定類型自己,如果你知道它是什麼:postgres::Result<MyType>
  2. 讓編譯器推斷它爲你(如果它在其他地方有足夠的信息):postgres::Result<_>

但是,在返回類型(->之後)沒有觸發類型推斷,因此只有選項1可用。

(提示:你還有一個絕招你的袖子,找出所需的類型,您可以嘗試指定單位類型:... -> postgres::Result<()>和檢查,如果編譯器錯誤抱怨諸如「預期MyType,發現()」。這意味着你要指定... -> postgres::Result<MyType>

+0

感謝您的技巧建議,取得了一些進展,但編譯器仍在抱怨,我確信有一個原因。 – Caballero

+1

我建議恢復你有的''a''的生命期,並用它來代替''_',因爲編譯器不會推斷它。 –

+0

@Caballero事實上,你在複製錯誤消息時只做了一步,因爲''_'是匿名生命週期,並且不鼓勵你命名爲'_'。通常他們被稱爲「a」或「b」。看到[你的第二個問題連續](http://stackoverflow.com/questions/30784279/rust-borrowed-value-does-not-live-long-enough),我建議,也許你想暫停編寫代碼有一段時間,並且[Rust book](https://doc.rust-lang.org/book)(具體在這裏,[lifetimes部分](https://doc.rust-lang))瞭解語言。組織/電子書/ lifetimes.html))。 – mdup

2

Result被定義爲postgres::Result<T>(我們說它是一般在T個)。根據insert_user功能的內部結構,也可能是Result<bool>Result<u64>Result<()>或別的東西entierly。

例如,Transaction上的execute方法返回Result<u64>,所以這是一個可能的變體。