Apa sintaks untuk string string multiline?

Jawaban:

173

Semua string literal dapat dipecah di beberapa baris; sebagai contoh:

let string = "line one
line two";

adalah string dua baris, sama seperti "line one\nline two"(tentu saja seseorang dapat menggunakan \nescape baris baru secara langsung juga). Jika Anda ingin memecah string di beberapa baris untuk alasan pemformatan, Anda dapat keluar dari baris baru dan memimpin spasi putih dengan \; sebagai contoh:

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

sama dengan "one line written over several".

Jika Anda ingin linebreak dalam string, Anda dapat menambahkannya sebelum \:

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

Itu sama dengan "multiple\nlines\nwith\nindentation";

huon
sumber
2
Jika hanya keterbacaan yang menjadi masalah, saya ingin menambahkan concat!()makro untuk melengkapi opsi yang diberikan ( doc.rust-lang.org/std/macro.concat.html )
hakononakani
82

Jika Anda ingin melakukan sesuatu yang sedikit lebih lama, yang mungkin termasuk tanda kutip, garis miring terbalik, dll., Gunakan notasi literal string mentah :

let shader = r#"
    #version 330

    in vec4 v_color;
    out vec4 color;

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

Jika Anda memiliki urutan tanda kutip ganda dan simbol hash di dalam string Anda, Anda dapat menunjukkan jumlah hash yang berubah-ubah sebagai pembatas:

let crazy_raw_string = r###"
    My fingers #"
    can#"#t stop "#"" hitting
    hash##"#
"###;
c0g
sumber
Tapi ... Anda hanya perlu keluar dari baris baru jika Anda tidak ingin baris baru di hasil, dan string mentah tidak membantu dengan itu.
poolie
String mentah hanya mencegah Anda dari harus menambahkan '\' di akhir setiap baris jika Anda tidak peduli dengan baris baru (seperti ketika Anda menanamkan kode yang merupakan baris agnostik baru seperti shader dan kernel) atau, seperti yang Anda singgung untuk, ketika baris baru sebenarnya diperlukan. Itu hanya membuatnya lebih mudah untuk menyematkan kode yang mungkin ingin Anda edit dan tidak perlu repot dengan '\' di akhir setiap baris. Itu saja.
c0g
1
Jika Anda ingin (atau tidak keberatan) baris baru dalam string yang dihasilkan, string ganda yang dikutip akan baik-baik saja, seperti yang ditunjukkan dalam contoh lain. Jika Anda ingin menghindari baris baru, string mentah tidak bagus. Mereka benar-benar hanya membantu jika teks menyertakan tanda kutip, garis miring terbalik, dll - seperti yang mungkin terjadi pada sumber yang disematkan.
poolie
2
Saya melihat apa yang Anda dapatkan sekarang dan Anda benar sekali.
c0g
1
Akan membantu untuk menunjukkan hasil pencetakan string ini. Dari jawaban itu sendiri saya tidak tahu apa yang akan terjadi dengan baris baru, dan bagaimana indentasi ditangani.
bluenote10
48

Jawaban Huon benar tetapi jika lekukan mengganggu Anda, pertimbangkan untuk menggunakan Indoc yang merupakan makro prosedural untuk string multi-line indentasi. Itu singkatan dari "dokumen indentasi." Ini memberikan makro yang disebut indoc!()yang mengambil string multiline literal dan lepaskan indentasi sehingga karakter non-spasi paling kiri ada di kolom pertama.

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

Hasilnya adalah "line one\nline two\n".

Whitespace dipertahankan relatif terhadap karakter non-spasi paling kiri dalam dokumen, jadi yang berikut memiliki dua spasi indentasi 3 spasi relatif terhadap baris satu:

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

Hasilnya adalah "line one\n line two\n".

dtolnay
sumber
8

Jika Anda ingin membuat indentasi teks multiline dalam kode Anda:

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

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

Hasilnya adalah sebagai berikut:

Multiline text goes next:
first line
second line
third line
Igor
sumber
Tolong nyatakan secara eksplisit , menggunakan prosa, kode apa yang penting untuk perilaku ini.
Shepmaster
Saat ini, ini tampaknya tidak menambahkan sesuatu yang baru ke jawaban yang diterima , yang menyatakan: seseorang dapat menggunakan \npelarian baris baru [...] Anda dapat keluar dari baris baru dan memimpin spasi putih dengan a{backslash} . (Sangat sulit untuk mengetikkan backslash dalam kode dalam komentar, tampaknya.)
Shepmaster
2
Komentar ini menyarankan cara untuk menggabungkan dua poin dalam jawaban yang diterima: bagaimana Anda dapat menghasilkan string multi-baris, ditulis sebagai baris multi-baris dalam kode, tetapi pada saat yang sama diizinkan untuk — untuk alasan gaya atau keterbacaan — dapatkan lekukannya sendiri dalam kode, tanpa lekukan ini berakhir pada string terakhir. Itu tidak dibuat sangat jelas dalam teks, tetapi ini adalah kasus penggunaan umum dan karenanya saran yang berharga. (Lihat jawaban oleh dtolnay untuk versi peti ini.)
Dato