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 хэшей⁶.
Вот как для меня работает визуализация необработанных строковых литералов:
На этом пока все!
Понравился этот пост?
использованная литература
- Https://doc.rust-lang.org/stable/reference/
- Https://doc.rust-lang.org/stable/reference/tokens.html#string-literals
- Https://github.com/alexcrichton/toml-rs/blob/master/examples/decode.rs
- Https://github.com/serde-rs/json
- Https://doc.rust-lang.org/stable/reference/tokens.html#raw-string-literals
- Https://github.com/rust-lang/rust/blob/master/src/grammar/raw-string-literal-ambiguity.md
- Http://www.bottlecaps.de/rr/ui
Первоначально опубликовано на rahul-thakoor.github.io.