Подтвердить что ты не робот

Каков синтаксис для многострочного строкового литерала?

Мне сложно понять, как работает синтаксис строк в Rust. В частности, я пытаюсь выяснить, как сделать несколько строк строки.

4b9b3361

Ответ 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".