首页 文章

多行字符串文字的语法是什么?

提问于
浏览
54

我很难弄清楚Rust中的字符串语法是如何工作的 . 具体来说,我正在试图弄清楚如何制作一个多行字符串 .

3 回答

  • 76

    如果你想做更长的事情,可能包括引号,反斜杠等,可以使用raw string literal notation

    let shader = r#"
        #version 330
    
        in vec4 v_color;
        out vec4 color;
    
        void main() {
            color = v_color;
        };
    "#;
    

    如果字符串中包含双引号和散列符号序列,则可以将任意数量的散列表示为分隔符:

    let crazy_raw_string = r###"
        My fingers #"
        can#"#t stop "#"" hitting
        hash##"#
    "###;
    
  • 36

    所有字符串文字都可以跨越几行,例如

    let string = "line one
    line two";
    

    是一个两行字符串,与 "line one\nline two" 相同(当然也可以直接使用 \n 换行符) . 如果您希望仅出于格式化原因而断开多行的字符串,则可以使用 \ 转义换行符和前导空格 .

    let string = "one line \
        written over \
        several";
    

    "one line written over several" 相同 .

  • 28

    Huon's answer是正确的,但如果缩进困扰您,请考虑使用Indoc这是缩进多行字符串的过程宏 . 它代表"indented document."它提供了一个名为 indoc!() 的宏,它接受多行字符串文字并取消缩进,使最左边的非空格字符位于第一列 .

    let s = indoc!("
              line one
              line two");
    

    结果是 "line one\nline two" .

    如果您愿意,可以使用几种等效方法来格式化相同的内容,因此请选择您喜欢的方法 . 以下两者都会产生与上面相同的字符串 . 内容可以根据需要缩进 - 它不必是特定数量的空格 .

    let s = indoc!(
             "line one
              line two");
    
    let s = indoc!("line one
                    line two");
    

    相对于文档中最左边的非空格字符保留空白,因此以下行相对于第一行有两行缩进的3个空格:

    let s = indoc!("
              line one
                 line two");
    

    结果是 "line one\n line two" .

相关问题