2014-10-28 7 views
21

Ich sah den Operator r#"" in Rust, aber ich kann nicht finden, was es tut. Es kam praktisch für die Erstellung von JSON:Der Operator r # "" # in Rust

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

Was ist der Name des Betreibers r#"" und wie mache ich var1 bewerten?

Antwort

22

Ich kann nicht finden, was sie tut

Es hat mit Stringliterale und rohe Strings zu tun. Ich denke, es ist ziemlich gut erklärt in this part of the documentation, in dem Codeblock, der dort geschrieben wird, kann man sehen, was es tut:

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

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

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

die Notwendigkeit negiert Sonderzeichen innerhalb der Zeichenfolge zu entkommen.

29

Das r Zeichen am Anfang eines Zeichenfolgenliterals bezeichnet eine raw string literal. Es ist kein Operator, sondern ein Präfix.

In einem normalen Zeichenfolgenliteral müssen einige Zeichen als Teil der Zeichenfolge zurückgeblendet werden, z. B. " und \. Das " Zeichen muss maskiert werden, da andernfalls die Zeichenfolge beendet würde, und das \ muss maskiert werden, da es das Escape-Zeichen ist.

In rohen Stringliterale, können Sie eine beliebige Anzahl von # Symbolen zwischen den r und der Öffnung " setzen. Um das unverschlüsselte Zeichenfolgenliteral zu schließen, müssen Sie eine abschließende " haben, gefolgt von der gleichen Anzahl von # Zeichen, wie es am Anfang sind. Mit Null oder mehr # Zeichen können Sie Literal \ Zeichen in der Zeichenfolge einfügen (\ Zeichen haben keine besondere Bedeutung). Mit einem oder mehreren # Zeichen können Sie Literal " Zeichen in der Zeichenfolge einfügen. Wenn Sie eine Zeichenfolge von # Zeichen gefolgt von " in der Zeichenfolge benötigen, verwenden Sie einfach die gleiche Anzahl Zeichen plus eine, um die Zeichenfolge zu begrenzen. Beispiel: r##"foo #"# bar"## steht für die Zeichenfolge foo #"# bar. Das Literal hört nicht bei dem Zitat in der Mitte auf, weil es nur von einem # gefolgt wird, während das Literal mit zwei # gestartet wurde.

Um den letzten Teil Ihrer Frage zu beantworten, gibt es keine Möglichkeit, ein Zeichenfolgenliteral zu verwenden, das Variablen im aktuellen Bereich auswertet. Einige Sprachen, wie PHP, unterstützen das, aber nicht Rust. Sie sollten stattdessen das Makro format! verwenden. Beachten Sie, dass Sie für JSON die geschweiften Klammern immer noch verdoppeln müssen, selbst in einem unverarbeiteten Zeichenkettenliteral, da die Zeichenkette vom Makro interpretiert wird.

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

Wenn Sie eine Menge von JSON zu erzeugen, there are many crates that will make it easier for you. Insbesondere können Sie unter serde_json reguläre Rust-Strukturen oder -Enums definieren und sie automatisch in JSON serialisieren lassen.

+0

Was macht #? –

+3

Es ist nur ein Trennzeichen, das Teil der Syntax für Raw-String-Literale ist. –