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

Как написать многострочную строку в Rust?

Можно ли написать что-то вроде:

fn main() {
    let my_string: &str = "Testing for new lines \
                           might work like this?";
}
4b9b3361

Ответ 1

Если я правильно читаю ссылку на язык, похоже, это должно сработать. Язык ref утверждает, что поддерживается \n и т.д. (Как обычные экранированные символы для вставки разрывов строк в строку), а также "дополнительные экранированные символы", включая LF, CR и HT.

Ответ 2

Другой способ сделать это - использовать строковый литерал строки:

Строковые литералы не обрабатывают никаких экранов. Они начинаются с символ U+0072 (r), за которым следует ноль или более символа U+0023(#) и a U+0022 (double-quote). Тело необработанной строки может содержат любую последовательность символов Юникода и заканчиваются только другой символ U+0022 (double-quote), за которым следует тот же номер из U+0023 (#) символов, предшествующих открытию U+0022(двойной кавычки).

Все символы Юникода, содержащиеся в корпусе необработанной строки, представляют себя, символы U+0022 (двойная кавычка) (за исключением случаев, когда они следуют по меньшей мере, столько символов U+0023 (#), сколько было использовано для запуска raw string literal) или U+005C (\) не имеют особого значения.

Примеры строковых литералов:

"foo"; r"foo";                     // foo
"\"foo\""; r#""foo""#;             // "foo"

"foo #\"# bar";
r##"foo #"# bar"##;                // foo #"# bar

"\x52"; "R"; r"R";                 // R
"\\x52"; r"\x52";                  // \x52

Ответ 3

Существует два способа написания многострочных строк в Rust, которые имеют разные результаты. Вы должны выбирать между ними с осторожностью в зависимости от того, что вы пытаетесь выполнить.

Метод 1: Висячие пробелы

Если строка, начинающаяся с ", содержит литеральный разрыв строки, компилятор Rust "сожрает" все пробелы между последним небетовым символом строки и первым небетовым символом следующей строки и замените их на один .

Пример:

fn test() {
    println!("{}", "hello  
    world");
}

Независимо от того, сколько символов буквально (пробел) (нуль или сто) появляются после hello, вывод выше всегда будет hello world.

Метод 2: разрыв строки с обратным слэшем

Это полная противоположность. В этом режиме все пробелы перед литеральным \ в первой строке сохраняются, а все последующие пробелы на следующей строке также сохраняются.

Пример:

fn test() {
    println!("{}", "hello  \
    world");
}

В этом примере вывод hello world.

Кроме того, как упоминалось в другом ответе, у Rust есть строки "raw literal", но они не входят в это обсуждение, так как в Rust (в отличие от некоторых других языков, которым нужно прибегать к необработанным строкам для этого) поддерживает литеральные разрывы строк в цитируемый контент без ограничений, как мы можем видеть выше.

Ответ 4

Если вы хотите избежать появления символов новой строки и лишних пробелов, вы можете использовать макрос concat!. Он объединяет строковые литералы во время компиляции.

let my_string = concat!(
    "Testing for new lines ",
    "might work like this?",
);

assert_eq!(my_string, "Testing for new lines might work like this?");

Подробнее на https://doc.rust-lang.org/std/macro.concat.html