Символ r
в начале строкового литерала обозначает raw string literal. Это не оператор, а префикс.
В нормальном строковом литерале есть некоторые символы, которые необходимо удалить, чтобы сделать их частью строки, например "
и \
. Символ "
должен быть экранирован, потому что он в противном случае завершает строку, а \
должен быть экранирован, потому что это символ escape.
В строковых литералах строки вы можете поместить произвольное количество символов #
между r
и открытием "
. Чтобы закрыть строковый литерал, вы должны иметь закрытие "
, за которым следует такое же количество символов #
, что и в начале. С нулевым или более #
символами вы можете поместить буквами \
символов в строке (\
символов не имеют особого значения). С одним или несколькими символами #
вы можете поместить в строку литералы "
. Если вам нужна последовательность из #
символов, за которой следует "
в строке, просто используйте то же число #
символов плюс один, чтобы разграничить строку. Например: r##"foo #"# bar"##
представляет строку foo #"# bar
. Литерал не останавливается на цитате посередине, потому что за ней следует только один #
, тогда как литерал запускался с двумя #
.
Чтобы ответить на последнюю часть вашего вопроса, нет способа иметь строковый литерал, который оценивает переменные в текущей области. Некоторые языки, такие как PHP, поддерживают это, но не Rust. Вместо этого следует использовать макрос format!
. Обратите внимание, что для JSON вам все равно нужно удвоить фигурные скобки, даже в строчном литерале, потому что строка интерпретируется макросом.
fn main() {
let var1 = "test1";
let json = format!(r#"{{"type": "type1", "type2": {}}}"#, var1);
println!("{}", json) // => {"type2": "type1", "type2": test1}
}
Если вам нужно создать много JSON, there are many crates that will make it easier for you. В частности, с помощью serde_json
вы можете определить регулярные структуры или перечисления Rust и автоматически их преобразовать в JSON.
что делать # сделать? –
Это просто разделитель, который является частью синтаксиса для строковых литералов. –