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.
Was macht #? –
Es ist nur ein Trennzeichen, das Teil der Syntax für Raw-String-Literale ist. –