r # "Что это?" #

При работе с Rust вы часто будете сталкиваться с r#"something like this"#, особенно при работе с JSON и TOML файлами. Он определяет необработанный строковый литерал. Когда вы использовали бы необработанный строковый литерал и что делает его действительным необработанным строковым литералом?

Когда бы вы использовали необработанный строковый литерал?

Во-первых, давайте разберемся, что такое строковый литерал. Согласно The Rust Reference¹, строковый литерал - это последовательность любых символов Unicode, заключенных в два символа U + 0022 (двойные кавычки), за исключением самого U + 0022². Escape-символы в Тело строкового литерала обрабатываются. Тело строки не может содержать двойные кавычки. Если вам нужно вставить один, вы должны его избежать следующим образом: \".

В некоторых случаях экранирование двойных кавычек может быть обременительным, например при написании регулярных выражений или определении объекта JSON как строкового литерала. В этих ситуациях полезны необработанные строковые литералы, поскольку они позволяют писать литерал, не требуя экранирования.

Вот фрагмент из ящика toml³:

Или другой от serde-rs⁴:

Итак, необработанные строковые литералы полезны, но что делает их действительными?

Что делает необработанный строковый литерал?

Справочник Rust определяет необработанный строковый литерал как начинающийся с символа U + 0072 (r), за которым следует ноль или более символов U + 0023 (#) и символа U + 0022 (двойные кавычки). Необработанное тело строки может содержать любую последовательность символов Юникода и завершается только другим символом U + 0022 (двойные кавычки), за которым следует то же количество символов U + 0023 (#), которые предшествовали открывающему U + 0022 (двойная кавычка). цитата) символ⁵.

Управляющие символы в теле необработанной строки не обрабатываются.

Следовательно, допустимы все следующие необработанные строковые литералы:

Примерь на манеж

Если вам нужно включить символ двойной кавычки в необработанную строку, вы должны пометить начало и конец необработанной строки знаками решетки / решетки (#).

Примерь на манеж

Необработанное тело строки может содержать любую последовательность символов UNICODE, кроме "#, поскольку это завершит литерал. Если вы хотите включить конкретную последовательность, вам нужно изменить количество #, которые предшествуют открывающей двойной кавычке. Например:

Примерь на манеж

Аналогичным образом, если нужно включить "##, вы можете добавить еще # к начальному и конечному разделителям.

Заворачивать

Необработанные строковые литералы полезны, когда вам нужно избежать экранирования символов внутри литерала. Символы в необработанной строке представляют сами себя. Неформально необработанный строковый литерал - это буква r, за которой следует N хэшей (где N может быть нулем), кавычка, любые символы, затем кавычка, за которой следует N хэшей⁶.

Вот как для меня работает визуализация необработанных строковых литералов:

На этом пока все!

Понравился этот пост?

использованная литература

  1. Https://doc.rust-lang.org/stable/reference/
  2. Https://doc.rust-lang.org/stable/reference/tokens.html#string-literals
  3. Https://github.com/alexcrichton/toml-rs/blob/master/examples/decode.rs
  4. Https://github.com/serde-rs/json
  5. Https://doc.rust-lang.org/stable/reference/tokens.html#raw-string-literals
  6. Https://github.com/rust-lang/rust/blob/master/src/grammar/raw-string-literal-ambiguity.md
  7. Http://www.bottlecaps.de/rr/ui

Первоначально опубликовано на rahul-thakoor.github.io.