web-dev-qa-db-ja.com

Rustのr# ""#演算子とは何ですか?

Rustで演算子r#""を見ましたが、それが何をするのかわかりません。JSONを作成するのに役立ちました。

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

演算子r#""の名前は何ですか? var1を評価するにはどうすればよいですか?

45
アレックス

私はそれが何をするかを見つけることができません

文字列リテラルと生の文字列に関係しています。 ドキュメントのこの部分 で十分に説明されていると思います。そこに投稿されているコードブロックで、その機能を確認できます。

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

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

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

文字列内の特殊文字をエスケープする必要がなくなります。

47
Tim Castelijns

文字列リテラルの先頭にある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にシリアル化できます。

44
Francis Gagné

この奇妙な表記法を初めて目にしたのは、gliumチュートリアル(グラフィック管理用の古い木箱)で、GLSLコード(GL Shading言語)をGPUのシェーダーに「カプセル化」して渡すために使用されます

https://github.com/glium/glium/blob/master/book/tuto-02-triangle.md

私が理解している限りでは、r#...#の内容は変更されていないように見えますが、どのような意味でも解釈されません。したがって、raw文字列。

0
bendeg