2015-05-27 23 views
2

所以我有這樣的:字符串連接錯誤:預期文字

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

fn main() { 

    let user = User { 
     reference: "ref".to_string(), 
     email: "[email protected]".to_string(), 
     firstname: "John".to_string(), 
     lastname: "Doe".to_string() 
    }; 

    concat!(&user.firstname.as_string(), " ", &user.lastname.as_string()); 

} 

多數民衆贊成返回一個錯誤:

error: expected a literal 
concat!(&user.firstname.as_string(), " ", &user.lastname.as_string()); 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~ 

但我認爲.as_string()已經使得文字,不是嗎?我也發現as_slice()as_str()引用到處都是,它很混亂。哪一個?

UPDATE OK,我希望我沒有在這裏貼了整個事情,但我想我只是要做到這一點反正:

extern crate postgres; 

use postgres::{Connection, SslMode}; 

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

fn main() { 

    let conn = Connection::connect("postgres://postgres:[email protected]/mydb", &SslMode::None).unwrap(); 

    let user = User { 
     reference: "ref".to_string(), 
     email: "[email protected]".to_string(), 
     firstname: "John".to_string(), 
     lastname: "Doe".to_string() 
    }; 
    let query = "INSERT INTO foo (user_id, name) VALUES ((SELECT id FROM user WHERE email = $1), $2)"; 
    conn.execute(query, &[&user.email, concat!(&user.firstname.as_slice(), " ", &user.lastname.as_slice())]).unwrap(); 

} 
+0

你究竟想在這裏完成什麼? –

+0

@DanielFath更新了上下文代碼 – Caballero

回答

11

這裏有誤解。

concat!是一個宏,即「代碼生成」機制;作爲結果,可以在編譯的第一階段膨脹,型分辨率/所有權檢查/等之前...

文本是書面的值按原樣在代碼true1"hello";表達式的結果不能是是文字(按定義)。結果類型可能看起來相似(甚至完全相同),但類型在這裏無關緊要。


那麼,你真的想要什麼?我想你只是想連接字符串。對於String,你可以用+

let fullname = user.firstname + " " + user.lastname; 
conn.execute(query, &[&user.email, &fullname]).unwrap(); 

另外,如果你需要一些更復雜的格式,你可以使用format!宏(不需要文字),這將是:

let fullname = format!("{} {}", user.firstname, user.lastname); 
3

concat!預計字面如在符號文字(如true,32'c', "string"),因爲它在編譯階段的最早部分工作。在此期間,運行時類型的值尚未解析。

根據您postgress例如,它似乎是最好的行動當然是簡單地創建一個返回的全名或任何你需要的功能:

struct User { 
    ... //same 
} 

impl User { 

    fn get_fullname(&self) -> String 
    { 
     let mut fullname = String::new(); 
     fullname.push_str(&self.firstname); 
     fullname.push_str(" "); 
     fullname.push_str(&self.lastname); 
     fullname 
    } 
} 

fn main() { 

    let user = User { 
     reference: "ref".to_string(), 
     email: "[email protected]".to_string(), 
     firstname: "John".to_string(), 
     lastname: "Doe".to_string() 
    }; 
    let x = &[&user.email, &user.get_fullname()]; 
    conn.execute(query, &[x]); 

我提出這一點,因爲它似乎越來越全名是什麼你會想經常在你的結構中使用。但是,如果沒有,您可以將值設置爲Matthiueu M.提供的值,並將它們連接起來,假設這是一次性事物。

Playground

+2

澄清:'concat!'完全在編譯時*完成它的工作*;它無法加入運行時值。你想*的東西就像'格式!(「{} {}」,第一,第二)''。 –

+1

@DK。謝謝,這正是我所需要的。 – Caballero