web-dev-qa-db-ja.com

複数行の文字列リテラルの構文は何ですか?

Rustで文字列構文がどのように機能するかを理解するのに苦労しています。具体的には、複数行の文字列を作成する方法を見つけようとしています。

87
Dumbapples

すべての文字列リテラルは、複数の行に分割できます。

let string = "line one
line two";

"line one\nline two"と同じ2行の文字列です(もちろん、\n改行エスケープを直接使用することもできます)。フォーマットの理由で文字列を複数行に分割する場合は、\を使用して改行と先頭の空白をエスケープできます。

let string = "one line \
    written over \
    several";

"one line written over several"と同じです。

115
huon

引用符やバックスラッシュなどを含む場合と含まない場合がありますが、もう少し長くしたい場合は、 raw string literal notation を使用します。

let shader = r#"
    #version 330

    in vec4 v_color;
    out vec4 color;

    void main() {
        color = v_color;
    };
"#;

文字列内に二重引用符とハッシュ記号のシーケンスがある場合、任意の数のハッシュを区切り文字として指定できます。

let crazy_raw_string = r###"
    My fingers #"
    can#"#t stop "#"" hitting
    hash##"#
"###;
53
c0g

Huonの答え は正しいですが、インデントが気になる場合は、 Indoc を使用することを検討してください。 「インデントされたドキュメント」の略です。 indoc!()と呼ばれるマクロを提供します。このマクロは、複数行の文字列リテラルを受け取り、インデントを解除して、左端の非スペース文字が最初の列にあるようにします。

let s = indoc!("
          line one
          line two");

結果は"line one\nline two"です。

必要に応じて同じものをフォーマットするためのいくつかの同等の方法がありますので、好きなものを選択してください。次の両方は、上記と同じ文字列になります。コンテンツは好きなだけインデントできます。特定のスペース数である必要はありません。

let s = indoc!(
         "line one
          line two");

let s = indoc!("line one
                line two");

空白はドキュメント内の左端の非スペース文字に関連して保持されるため、次の行には、行1に対して2行インデントされた3スペースがあります。

let s = indoc!("
          line one
             line two");

結果は"line one\n line two"です。

36
dtolnay

コード内で複数行のテキストをインデントする場合:

let s = "first line\n\
    second line\n\
    third line";

println!("Multiline text goes next:\n{}", s);

結果は次のようになります。

Multiline text goes next:
first line
second line
third line
7
Igor