Що таке синтаксис для багаторядкового літерального рядка?


Відповіді:


173

Всі літеральні рядки можуть бути розбиті на кілька рядків; наприклад:

let string = "line one
line two";

являє собою дворядковий рядок, такий самий, як "line one\nline two"(звичайно, можна також використовувати \nновий рядок прямо). Якщо ви хочете просто перервати рядок по декількох рядках з причин форматування, ви можете уникнути нового рядка та провідних пробілів за допомогою символу a \; наприклад:

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

те саме, що "one line written over several".

Якщо ви хочете переривання рядків у рядку, ви можете додати їх перед \:

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

Це те саме, що "multiple\nlines\nwith\nindentation";


2
Якщо проблемою є лише читабельність, я хотів би додати concat!()макрос для завершення заданих параметрів ( doc.rust-lang.org/std/macro.concat.html )
hakononakani

82

У випадку, якщо ви хочете зробити щось довше, що може включати цитати, зворотні риси тощо, використовуйте буквене позначення необробленого рядка :

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##"#
"###;

Але ... вам потрібно уникати нових рядків лише в тому випадку, якщо ви не хочете нових рядків у результаті, а необроблені рядки не допомагають у цьому.
poolie

Сирі рядки просто заважають вам додавати "\" в кінці кожного рядка, якщо вам не байдуже нові рядки (наприклад, коли ви вставляєте код, який є агностиком нового рядка, як шейдери та ядра) або, як ви все нагадали до, коли нові строки фактично необхідні. Це просто полегшує вбудовування коду, який ви хочете відредагувати, і не потрібно мати клопотів із знаком "\" в кінці кожного рядка. Це все.
c0g

1
Якщо ви хочете (або не заперечуєте) нові рядки в результуючому рядку, прості рядки з подвійним цитуванням будуть добре виконані, як показано в інших прикладах. Якщо ви хочете уникнути нових рядків, необроблені рядки не будуть корисними. Вони дійсно допомагають лише у тому випадку, якщо текст включає цитати, зворотні риси тощо, як це може статися із вбудованим джерелом.
poolie

2
Я бачу, що ви зараз отримуєте, і ви абсолютно праві.
c0g

1
Це допомогло б показати вихід друку цих рядків. З самої відповіді я не можу сказати, що буде з новими рядками та як обробляється відступ.
bluenote10

48

Відповідь Хуона правильна, але якщо відступ турбує вас, розгляньте можливість використання Indoc, який є процедурним макросом для відступів багаторядкових рядків. Він розшифровується як "відступний документ". Він надає макрос, який називається indoc!()багаторядковим рядковим літералом і не відступає його, так що крайній лівий символ, який не знаходиться в пробілі, знаходиться в першому стовпці.

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

Результат - "line one\nline two\n".

Пробіл зберігається відносно крайнього лівого символу непробілу в документі, тому наступний рядок має два відступних 3 пробіли відносно першого рядка:

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

Результат - "line one\n line two\n".


8

У випадку, якщо ви хочете відкласти багаторядковий текст у своєму коді:

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

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

Результатом буде таке:

Multiline text goes next:
first line
second line
third line

Будь ласка, чітко вкажіть, використовуючи прозу, який фрагмент коду важливий для цієї поведінки.
Шепмайстер

Зараз, схоже, це не додає нічого нового до прийнятої відповіді , яка говорить: можна скористатися \nвтечею нового рядка [...], ви можете уникнути нового рядка та провідних пробілів за допомогою а{backslash} . (дуже важко ввести коментар у
косовій косі

2
Цей коментар пропонує спосіб поєднати два пункти у прийнятій відповіді: як можна створити багаторядковий рядок, записаний у вигляді декількох рядків у коді, але при цьому дозволено - для стилістичної чи розбірливості - отримати власне відступ у коді, без цього відступ закінчується у заключному рядку. Це не дуже зрозуміло в тексті, але це звичайний випадок використання і, таким чином, цінна пропозиція imho. (Дивіться відповідь dtolnay для версії цього ящика.)
Dato
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.