2014-10-28 15 views
21

Я видел оператора r#"" в Rust, но я не могу найти, что он делает. Это пригодилось для создания JSON:Оператор r # "" # в ржавчине

let var1 = "test1"; 
let json = r#"{"type": "type1", "type2": var1}"#; 
println!("{}", json) // => {"type2": "type1", "type2": var1} 

Что имя оператора r#"" и как сделать var1 оценивать?

ответ

22

Я не могу найти то, что он делает

Он имеет дело с строковых литералов и необработанных строк. Я думаю, что это объясняется очень хорошо в this part of the documentation в блоке кода, который размещен там вы можете увидеть, что он делает:

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

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

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

Это исключает необходимость избежать специальных символов внутри строки.

29

Символ 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.

+0

что делать # сделать? –

+3

Это просто разделитель, который является частью синтаксиса для строковых литералов. –

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