Rust的r#“”#运算符是什么?

时间:2014-10-28 15:04:36

标签: string syntax rust

我在Rust中看到了运算符r#"",但我找不到它的作用。它在创建JSON时非常方便:

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

运营商r#""的名称是什么?如何评价var1

3 个答案:

答案 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 字符串。