2015-04-07 13 views
33

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

+1

Возможный дубликат [Как написать многострочную строку в Rust?] (Http://stackoverflow.com/questions/15265198/how-do-i-write-a-multi-line-string-in -rust) –

ответ

52

Все строковые литералы могут быть разбиты на несколько строк, например.

let string = "line one 
line two"; 

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

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

такое же, как "one line written over several".

+0

Спасибо! Я искал случай «line one/nline two». – Dumbapples

20

В случае, если вы хотите сделать что-то немного дольше, что может или не может включать в кавычки, обратные слэши и т.д., используйте 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##"# 
"###; 
+0

Но ... вам нужно только избегать строк новой строки, если вы не хотите, чтобы в результате появились символы новой строки, а необработанные строки не помогают. – poolie

+0

Необработанные строки просто не позволяют вам добавить «\» в конце каждой строки, если вам не нужны новые строки (например, когда вы вставляете код, который является агностиком новой строки, например шейдеры и ядра) или, как вы намечено, когда новые линии действительно необходимы. Это просто упрощает встраивание кода, который вы, возможно, захотите редактировать, и не должен беспокоиться о «\» в конце каждой строки. Это все. – c0g

+0

Если вы хотите (или не возражаете) символы новой строки в результирующей строке, простые строки с двойными кавычками будут работать отлично, как показано в других примерах. Если вы хотите избежать новых строк, необработанные строки не подходят.Они действительно помогают только в том случае, если текст включает в себя цитаты, обратные косые черты и т. Д. - как это может произойти во встроенном источнике. – poolie

19

Huon's answer является правильным, но если отступы беспокоит вас, рассмотреть возможность использования 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"); 

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

let s = indoc!(" 
      line one 
      line two"); 

Результатом является "line one\n line two".

Смежные вопросы