Rustで演算子r#""
を見ましたが、それが何をするのかわかりません。JSONを作成するのに役立ちました。
let var1 = "test1";
let json = r#"{"type": "type1", "type2": var1}"#;
println!("{}", json) // => {"type2": "type1", "type2": var1}
演算子r#""
の名前は何ですか? var1
を評価するにはどうすればよいですか?
私はそれが何をするかを見つけることができません
文字列リテラルと生の文字列に関係しています。 ドキュメントのこの部分 で十分に説明されていると思います。そこに投稿されているコードブロックで、その機能を確認できます。
"foo"; r"foo"; // foo "\"foo\""; r#""foo""#; // "foo" "foo #\"# bar"; r##"foo #"# bar"##; // foo #"# bar "\x52"; "R"; r"R"; // R "\\x52"; r"\x52"; // \x52
文字列内の特殊文字をエスケープする必要がなくなります。
文字列リテラルの先頭にあるr
文字は、 raw文字列リテラル を示します。これは演算子ではなく、プレフィックスです。
通常の文字列リテラルには、"
や\
など、文字列の一部にするためにエスケープする必要のある文字があります。 "
文字はエスケープする必要があります。そうしないと、文字列が終了するためです。また、\
はエスケープ文字であるため、エスケープする必要があります。
生の文字列リテラルでは、r
と開始#
の間に任意の数の"
シンボルを挿入できます。生の文字列リテラルを閉じるには、終了"
の後に、先頭にあるのと同じ数の#
文字が必要です。 0個以上の#
文字を使用すると、文字列にリテラル\
文字を含めることができます(\
文字には特別な意味はありません)。 1つ以上の#
文字を使用すると、文字列にリテラル"
文字を含めることができます。 "
に続いて文字列に#
文字のシーケンスが必要な場合は、同じ数の#
文字と1つを使用してください文字列を区切るため。例:r##"foo #"# bar"##
は、文字列foo #"# bar
を表します。リテラルは2つの#
で開始されたのに対し、リテラルは1つの#
のみが続くため、中央の引用符で停止しません。
質問の最後の部分に答えるために、現在のスコープ内の変数を評価する文字列リテラルを持つ方法はありません。 PHPなどの一部の言語は、それをサポートしていますが、Rustはサポートしていません。代わりに format!
マクロの使用を検討する必要があります。 JSONでは、文字列はマクロによって解釈されるため、生の文字列リテラルであっても、中括弧を2倍にする必要があることに注意してください。
fn main() {
let var1 = "test1";
let json = format!(r#"{{"type": "type1", "type2": {}}}"#, var1);
println!("{}", json) // => {"type2": "type1", "type2": test1}
}
多くのJSONを生成する必要がある場合は、 あなたにとって使いやすい箱がたくさんあります 。特に、 serde_json
を使用すると、通常のRust構造体または列挙型を定義し、それらを自動的にJSONにシリアル化できます。
この奇妙な表記法を初めて目にしたのは、gliumチュートリアル(グラフィック管理用の古い木箱)で、GLSLコード(GL Shading言語)をGPUのシェーダーに「カプセル化」して渡すために使用されます
https://github.com/glium/glium/blob/master/book/tuto-02-triangle.md
私が理解している限りでは、r#...#の内容は変更されていないように見えますが、どのような意味でも解釈されません。したがって、raw文字列。