2015-04-07 24 views
33

我很難搞清楚Rust中的字符串語法是如何工作的。具體來說,我試圖弄清楚如何製作多行字符串。多行字符串文字的語法是什麼?

+1

可能的重複[如何在Rust中編寫多行字符串?](http://stackoverflow.com/questions/15265198/how-do-i-write-a-multi-line-string-in -rust) –

回答

52

所有字符串文字可以分成幾行,

let string = "line one 
line two"; 

是一個兩行字符串,相同"line one\nline two"(當然可以直接使用\n換行符逃逸太)。如果您希望只是爲了格式化原因而將字符串分成多行,則可以使用\(例如1)來避開換行符和前導空格。

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

"one line written over several"相同。如果你想要做的事多一點的時間

+0

謝謝!我正在尋找「第一線/第二線」案例。 – Dumbapples

20

,這可能會或可能不包括引號,反斜槓,等等,使用raw string literal notation

let shader = r#" 
    #version 330 

    in vec4 v_color; 
    out vec4 color; 

    void main() { 
     color = v_color; 
    }; 
"#; 

如果有內雙引號和hash符號序列你的字符串,可以表示哈希任意數量的作爲分隔符:

let crazy_raw_string = r###" 
    My fingers #" 
    can#"#t stop "#"" hitting 
    hash##"# 
"###; 
+0

但是......如果你不想在結果中使用換行符,並且原始字符串沒有幫助,那麼只需要轉義換行符。 – poolie

+0

如果您不關心換行符(例如,當您嵌入的代碼是像着色器和內核這樣的新行不可知的代碼),或者就像您一樣,原始字符串只會阻止您在每行的末尾添加'\'暗示,換行符實際上是必要的。它只是讓您更容易嵌入您可能想要編輯的代碼,而不必在每行末尾加上'\'。就這樣。 – c0g

+0

如果你想(或不介意)結果字符串中的換行符,普通的雙引號字符串將會很好地完成,如其他例子所示。如果你想避免換行,原始字符串不好。如果文本包含引號,反斜槓等,它們確實只能提供幫助 - 這可能會發生在嵌入式源代碼中。 – poolie

19

Huon's answer是正確的,但如果壓痕困擾你,可以考慮使用Indoc這是一個程序宏縮進畝lti線字符串。它代表「縮進文檔」。它提供了一個名爲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"

相關問題