2014-10-28 15 views
21

Tôi thấy toán tử r#"" trong Rust nhưng tôi không thể tìm thấy nó. Nó đã có ích cho việc tạo JSON:Toán tử r # "" # trong Rust

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

tên của các nhà điều hành r#"" là gì và làm thế nào để làm cho var1 đánh giá?

Trả lời

22

tôi không thể tìm thấy những gì nó làm

Nó đã làm với xâu chuỗi và thô. Tôi nghĩ rằng nó được giải thích khá tốt trong this part of the documentation, trong khối mã được đăng ở đó bạn có thể nhìn thấy những gì nó làm:

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

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

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

Nó phủ nhận sự cần thiết phải thoát khỏi nhân vật đặc biệt bên trong chuỗi.

29

Ký tự r khi bắt đầu một chuỗi ký hiệu có nghĩa là raw string literal. Nó không phải là một toán tử, mà là một tiền tố.

Trong chuỗi ký tự bình thường, có một số ký tự mà bạn cần phải thoát ra để làm cho chúng trở thành một phần của chuỗi, chẳng hạn như "\. Các ký tự " cần phải được thoát vì nó sẽ kết thúc bằng cách khác, và \ cần phải được thoát vì nó là ký tự thoát.

Trong chuỗi ký tự thô, bạn có thể đặt số lượng # biểu tượng tùy ý giữa r và mở ". Để đóng chuỗi ký tự thô, bạn phải đóng một số ", theo sau là cùng một số ký tự # như lúc bắt đầu. Với số không hoặc nhiều hơn # ký tự, bạn có thể đặt ký tự \ bằng chữ trong chuỗi (\ ký tự không có bất kỳ ý nghĩa đặc biệt nào). Với một hoặc nhiều ký tự #, bạn có thể đặt các ký tự " bằng chữ vào chuỗi. Nếu bạn cần một chuỗi gồm # ký tự, theo sau là " trong chuỗi, chỉ cần sử dụng cùng một số # ký tự cộng một để phân tách chuỗi đó. Ví dụ: r##"foo #"# bar"## đại diện cho chuỗi foo #"# bar. Các chữ không dừng lại ở các báo ở giữa, bởi vì nó chỉ theo sau bởi một #, trong khi chữ được bắt đầu với hai #.

Để trả lời phần cuối của câu hỏi của bạn, không có cách nào để có chuỗi ký tự đánh giá các biến trong phạm vi hiện tại. Một số ngôn ngữ, chẳng hạn như PHP, hỗ trợ, nhưng không phải Rust. Thay vào đó, bạn nên cân nhắc sử dụng macro format!. Lưu ý rằng đối với JSON, bạn sẽ vẫn cần phải gấp đôi niềng răng, ngay cả trong chuỗi ký tự thô, bởi vì chuỗi được giải thích bởi macro.

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

Nếu bạn cần tạo nhiều JSON, there are many crates that will make it easier for you. Đặc biệt, với serde_json, bạn có thể xác định cấu trúc hoặc các enum thông thường của Rust và tự động được tuần tự hóa thành JSON.

+0

# làm gì? –

+3

Nó chỉ là một dấu phân tách là một phần của cú pháp cho chuỗi ký tự thô. –