Мне сложно понять, как работает синтаксис строк в Rust. В частности, я пытаюсь выяснить, как сделать несколько строк строки.
Каков синтаксис для многострочного строкового литерала?
Ответ 1
Все строковые литералы могут быть разбиты на несколько строк, например
let string = "line one
line two";
- строка с двумя строками, то же самое, что и "line one\nline two"
(конечно же, можно использовать escape-строку \n
непосредственно). Если вы хотите просто сломать строку по нескольким строкам по причинам форматирования, вы можете избежать появления новой строки и ведущих пробелов с помощью \
, например
let string = "one line \
written over \
several";
совпадает с "one line written over several"
.
Ответ 2
Если вы хотите сделать что-то немного дольше, что может включать или не включать в себя кавычки, обратные косые черты и т.д., используйте 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##"#
"###;
Ответ 3
Ответ 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");
Пробелы сохраняются относительно самого левого непространственного символа в документе, поэтому следующее имеет две строки с отступом 3 пробела относительно первой:
let s = indoc!("
line one
line two");
Результат "line one\n line two"
.