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ư "
và \
. 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.
# làm gì? –
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ô. –