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";
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##"#
"###;
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:
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.)
Jawaban:
Semua string literal dapat dipecah di beberapa baris; sebagai contoh:
adalah string dua baris, sama seperti
"line one\nline two"
(tentu saja seseorang dapat menggunakan\n
escape 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:sama dengan
"one line written over several"
.Jika Anda ingin linebreak dalam string, Anda dapat menambahkannya sebelum
\
:Itu sama dengan
"multiple\nlines\nwith\nindentation";
sumber
concat!()
makro untuk melengkapi opsi yang diberikan ( doc.rust-lang.org/std/macro.concat.html )Jika Anda ingin melakukan sesuatu yang sedikit lebih lama, yang mungkin termasuk tanda kutip, garis miring terbalik, dll., Gunakan notasi literal string mentah :
Jika Anda memiliki urutan tanda kutip ganda dan simbol hash di dalam string Anda, Anda dapat menunjukkan jumlah hash yang berubah-ubah sebagai pembatas:
sumber
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.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:
Hasilnya adalah
"line one\n line two\n"
.sumber
Jika Anda ingin membuat indentasi teks multiline dalam kode Anda:
Hasilnya adalah sebagai berikut:
sumber
\n
pelarian 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.)