【问题标题】:What is the r#""# operator in Rust?Rust 中的 r#""# 运算符是什么?
【发布时间】:2014-12-24 01:18:14
【问题描述】:

我在 Rust 中看到了运算符 r#"",但我找不到它的作用。它在创建 JSON 时派上用场:

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

r#"" 的操作员叫什么名字?如何让var1 进行评估?

【问题讨论】:

    标签: string rust syntax string-literals


    【解决方案1】:

    我第一次看到这种奇怪的符号是在 glium 教程(用于图形管理的旧板条箱)中,用于“封装”并将 GLSL 代码(GL 着色语言)传递给 GPU 的着色器

    https://github.com/glium/glium/blob/master/book/tuto-02-triangle.md

    据我了解,看起来 r#...# 的内容没有被触及,它没有以任何方式解释。因此 raw 字符串。

    【讨论】:

      【解决方案2】:

      字符串文字开头的r 字符表示raw string literal。它不是运算符,而是前缀。

      在普通字符串文字中,您需要转义一些字符以使其成为字符串的一部分,例如"\" 字符需要转义,否则它会终止字符串,\ 需要转义,因为它是转义字符。

      在原始字符串文字中,您可以在r 和开头" 之间放置任意数量的# 符号。要关闭原始字符串文字,您必须有一个结束 ",后跟与开头相同数量的 # 字符。对于零个或多个# 字符,您可以将文字\ 字符放入字符串中(\ 字符没有任何特殊含义)。对于一个或多个 # 字符,您可以将文字 " 字符放入字符串中。如果您需要在字符串中使用" 后跟一系列# 字符,只需使用相同数量的# 字符加一个 来分隔字符串。例如:r##"foo #"# bar"## 表示字符串foo #"# bar。文字不会在中间的引号处停止,因为它后面只有一个#,而文字以两个@​​987654346@开头。

      要回答您问题的最后一部分,无法使用字符串文字来评估当前范围内的变量。一些语言,比如 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。

      【讨论】:

        【解决方案3】:

        我找不到它的作用

        它与字符串文字和原始字符串有关。我认为它在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
        

        它不需要转义字符串中的特殊字符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-28
          • 1970-01-01
          • 2019-01-05
          • 1970-01-01
          • 2014-11-19
          • 2021-10-29
          • 2018-09-20
          相关资源
          最近更新 更多