我在Rust中看到了运算符r#""
,但我找不到它的作用。它在创建JSON时非常方便:
let var1 = "test1";
let json = r#"{"type": "type1", "type2": var1}"#;
println!("{}", json) // => {"type2": "type1", "type2": var1}
运营商r#""
的名称是什么?如何评价var1
?
答案 0 :(得分:44)
我找不到它的作用
它与字符串文字和原始字符串有关。我认为它在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
它无需转义字符串中的特殊字符。
答案 1 :(得分:43)
字符串文字开头的r
字符表示raw string literal。它不是运营商,而是前缀。
在普通的字符串文字中,有些字符需要转义才能使它们成为字符串的一部分,例如"
和\
。 "
字符需要进行转义,否则会终止字符串,\
需要转义,因为它是转义字符。
在原始字符串文字中,您可以在#
和开头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。
答案 2 :(得分:0)
我第一次看到这种奇怪的表示法是在glium教程(用于图形管理的旧板条箱)中,用于“封装”并将GLSL代码(GL着色语言)传递给GPU的着色器
https://github.com/glium/glium/blob/master/book/tuto-02-triangle.md
据我了解,r#...#的内容似乎保持不变,没有任何解释。因此是 raw 字符串。