Trudno mi zrozumieć, jak działa składnia napisów w Rust. W szczególności próbuję dowiedzieć się, jak utworzyć ciąg wielu wierszy.
Trudno mi zrozumieć, jak działa składnia napisów w Rust. W szczególności próbuję dowiedzieć się, jak utworzyć ciąg wielu wierszy.
Odpowiedzi:
Wszystkie literały łańcuchowe można podzielić na kilka linii; na przykład:
let string = "line one
line two";
jest łańcuchem "line one\nline two"
składającym się z dwóch wierszy, tym samym co (oczywiście można \n
też bezpośrednio użyć znaku nowego wiersza). Jeśli chcesz po prostu podzielić ciąg w wielu wierszach ze względu na formatowanie, możesz pominąć nową linię i początkowe białe spacje za pomocą \
; na przykład:
let string = "one line \
written over \
several";
jest taki sam jak "one line written over several"
.
Jeśli chcesz, aby w ciągu znaków występowały podziały wierszy, możesz je dodać przed \
:
let string = "multiple\n\
lines\n\
with\n\
indentation";
To jest to samo co "multiple\nlines\nwith\nindentation";
concat!()
makro, aby uzupełnić podane opcje ( doc.rust-lang.org/std/macro.concat.html )
Jeśli chcesz zrobić coś nieco dłużej, co może zawierać cudzysłowy, ukośniki odwrotne itp., Użyj nieprzetworzonej notacji literału ciągu :
let shader = r#"
#version 330
in vec4 v_color;
out vec4 color;
void main() {
color = v_color;
};
"#;
Jeśli masz sekwencje podwójnych cudzysłowów i symboli krzyżyka w swoim ciągu, możesz oznaczyć dowolną liczbę skrótów jako separator:
let crazy_raw_string = r###"
My fingers #"
can#"#t stop "#"" hitting
hash##"#
"###;
Odpowiedź Huona jest poprawna, ale jeśli przeszkadza ci wcięcie, rozważ użycie indoc, które jest makrem proceduralnym dla ciągów wieloliniowych z wcięciem . Oznacza „dokument z wcięciem”. Udostępnia makro o nazwie, indoc!()
które pobiera wielowierszowy literał ciągu i usuwa wcięcia, tak aby skrajny lewy znak niebędący spacją znalazł się w pierwszej kolumnie.
let s = indoc! {"
line one
line two
"};
Wynik jest "line one\nline two\n"
.
Biała spacja jest zachowywana względem skrajnego lewego znaku innego niż spacja w dokumencie, więc poniższy wiersz ma wcięcie w drugim wierszu o 3 spacje względem pierwszego wiersza:
let s = indoc! {"
line one
line two
"};
Wynik jest "line one\n line two\n"
.
Jeśli chcesz wciąć tekst wielowierszowy w swoim kodzie:
let s = "first line\n\
second line\n\
third line";
println!("Multiline text goes next:\n{}", s);
Wynik będzie następujący:
Multiline text goes next:
first line
second line
third line
\n
znaku nowego wiersza [...], można uciec od nowej linii i początkowych białych spacji za pomocą{backslash}
. (wydaje się, że bardzo trudno jest wpisać odwrotny ukośnik w kodzie w komentarzu.)