2014-10-28 42 views
21

我看到運營商r#"" Rust,但我找不到它做什麼。它派上了用場,用於創建JSON:運營商r#「」鏽#

let var1 = "test1"; 
let json = r#"{"type": "type1", "type2": var1}"#; 
println!("{}", json) // => {"type2": "type1", "type2": var1} 

什麼是運營商r#""的名字,我怎麼做var1評價?

回答

22

我找不到它做什麼

它有字符串和原始字符串做。我認爲這是在this part of the documentation解釋相當不錯,在張貼那裏,你可以看看它的代碼塊:

"foo"; r"foo";      // foo 
"\"foo\""; r#""foo""#;    // "foo" 

"foo #\"# bar"; 
r##"foo #"# bar"##;    // foo #"# bar 

"\x52"; "R"; r"R";     // R 
"\\x52"; r"\x52";     // \x52 

它否定了需要逃避字符串中的特殊字符。

29

r字符串開頭的字符表示raw string literal。它不是一個運營商,而是一個前綴。

在普通字符串文字中,有些字符需要轉義才能使它們成爲字符串的一部分,例如"\"字符需要轉義,因爲否則它會終止字符串,並且\需要轉義,因爲它是轉義字符。

在原始字符串文字中,您可以在r和開頭"之間插入任意數量的#符號。要關閉原始字符串文本,您必須先關閉",然後再開始時輸入相同數量的#個字符。使用零個或多個#個字符,可以將文字\中的字符放入字符串中(\個字符沒有任何特殊含義)。使用一個或多個#字符,可以將文字"字符放入字符串中。如果字符串中需要#字符後跟"的序列,則只需使用相同數量的#字符加上一個來分隔字符串。例如:r##"foo #"# bar"##代表字符串foo #"# bar。文字不會停留在中間的引號中,因爲它後面跟着一個#,而文字則以兩個#開頭。

要回答問題的最後部分,沒有辦法獲得一個字符串文字來評估當前範圍中的變量。有些語言如PHP支持這種語言,但不支持Rust。您應該考慮使用format!宏。請注意,對於JSON,即使在原始字符串文字中,仍然需要將大括號加倍,因爲該字符串是由宏解釋的。

fn main() { 
    let var1 = "test1"; 
    let json = format!(r#"{{"type": "type1", "type2": {}}}"#, var1); 
    println!("{}", json) // => {"type2": "type1", "type2": test1} 
} 

如果您需要生成大量的JSON,請致電there are many crates that will make it easier for you。特別是,使用serde_json,您可以定義常規的Rust結構或枚舉並將它們自動序列化爲JSON。

+0

#做什麼? – 2014-10-29 05:03:48

+3

這只是一個分隔符,它是原始字符串文字的語法的一部分。 – 2014-10-29 05:58:39