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


回答:


173

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

let string = "line one
line two";

と同じ2行の文字列です"line one\nline two"(もちろん、\n改行エスケープを直接使用することもできます)。書式設定の理由で文字列を複数行に分割するだけの場合は、\;で改行と先頭の空白をエスケープできます。例えば:

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

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

文字列に改行が必要な場合は、\:の前に追加できます。

let string = "multiple\n\
              lines\n\
              with\n\
              indentation";

それは同じです "multiple\nlines\nwith\nindentation";


2
読みやすさが問題である場合は、concat!()マクロを追加して、指定されたオプション(doc.rust-lang.org/std/macro.concat.html)を完成させたいと思います
hakononakani

82

引用符やバックスラッシュなどが含まれる場合と含まれない場合がある少し長いことを行う場合は、生の文字列リテラル表記を使用します

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##"#
"###;

しかし...結果に改行を入れたくない場合にのみ改行をエスケープする必要があり、生の文字列はそれを助けません。
poolie

生の文字列は、改行を気にしない場合(たとえば、シェーダーやカーネルのような改行に依存しないコードを埋め込む場合など)、またはおっしゃったように、すべての行の末尾に「\」を追加する必要がないようにします。改行が実際に必要な場合。編集したいコードを簡単に埋め込むことができ、各行の末尾にある「\」を煩わせる必要がありません。それで全部です。
c0g 2016

1
結果の文字列に改行が必要な場合(または気にしない場合)、他の例に示すように、二重引用符で囲まれたプレーンな文字列は完全にうまく機能します。改行を避けたい場合、生の文字列は良くありません。埋め込まれたソースで発生する可能性があるように、テキストが引用符、バックスラッシュなどを含む場合にのみ役立ちます。
poolie

2
私はあなたが今何を得ているかを見て、あなたは絶対的に正しいです。
c0g

1
これらの文字列を出力した結果を表示すると役立ちます。答え自体からは、改行で何が起こるのか、インデントがどのように処理されるのかわかりません。
bluenote10

48

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

let s = indoc! {"
    line one
    line two
"};

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

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

let s = indoc! {"
    line one
       line two
"};

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


8

コードで複数行のテキストをインデントしたい場合:

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

文章を使用して、この動作に重要なコードの一部を明示的に述べてください。
Shepmaster

今のところ、これが表示されますが、新しい何かを追加しないように受け入れ答えを述べ、:1が使用できる\n改行のエスケープを[...]あなたは改行をエスケープし、と空白をリードすることができます{backslash}。(コメントのコードにバックスラッシュを入力するのは非常に困難です。表示されます。)
Shepmaster

2
このコメントは、受け入れられた回答の2つのポイントを組み合わせる方法を提案しています。コードで複数行として記述された複数行の文字列を生成する方法は、同時に、スタイルまたは読みやすさの理由で許可されています。コード内の独自のインデント。このインデントは最終文字列で終わりません。テキストではあまり明確にされていませんが、これは一般的な使用例であるため、貴重な提案です。(これのクレートバージョンについては、dtolnayの回答を参照してください。)
Dato
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.