Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

多行字串 & raw string literal

本集目標

學會在 Rust 中撰寫多行字串、行接續符號、以及不需要跳脫字元的 raw string。

本集是第一章的補充。

概念說明

寫程式的時候,我們常常需要處理多行文字、檔案路徑、或是包含特殊字元的字串。Rust 提供了幾種好用的語法來應對這些情況。

多行字串

在 Rust 裡,字串字面值可以直接跨行:

fn main() {
    let poem = "床前明月光,
疑是地上霜。";
}

換行符號會直接被包含在字串裡。

行接續符 \

如果你想把很長的字串分行寫,但不要換行符號出現在結果裡,可以在行尾加 \。它會吃掉換行以及下一行開頭的空白:

fn main() {
    let long = "這是一段很長的句子,\
                但其實只有一行。";
    // 結果:"這是一段很長的句子,但其實只有一行。"
}

raw string literal

有時候字串裡有很多反斜線(例如 Windows 路徑),每個都要跳脫很煩。r"..." 語法讓你完全不需要跳脫:

fn main() {
    let path = r"C:\Users\test\documents";
    // 不需要寫成 "C:\\Users\\test\\documents"
}

包含引號的 raw string

如果 raw string 裡面需要有雙引號怎麼辦?用 r#"..."# 語法:

fn main() {
    let json = r#"{"name": "Andy", "age": 29}"#;
}

如果字串裡面連 "# 都有?那就多加幾層 #

fn main() {
    let tricky = r##"這裡有 "#" 符號"##;
}

你可以加任意多層 #,只要開頭和結尾的數量一致就好。

範例程式碼

fn main() {
    // 多行字串
    let haiku = "古池や
蛙飛び込む
水の音";
    println!("俳句:\n{}", haiku);
    println!("---");

    // 行接續符:\ 吃掉換行和前導空白
    let sentence = "Rust 是一門注重安全性、\
                    效能和並行的程式語言。";
    println!("{}", sentence);
    println!("---");

    // Raw string:不處理跳脫字元
    let win_path = r"C:\Users\Andy\Desktop\project";
    println!("路徑:{}", win_path);

    // 正則表示式之類的場景也很好用
    let pattern = r"\d+\.\d+";
    println!("正則:{}", pattern);

    // 包含雙引號的 raw string
    let json = r#"{"name": "小明", "score": 95}"#;
    println!("JSON:{}", json);

    // 多層 # —— 當字串裡有 "# 的時候
    let code_sample = r##"
        let s = r#"hello"#;
        println!("{}", s);
    "##;
    println!("程式碼範例:{}", code_sample);

    // raw string 也能多行
    let html = r#"
<html>
    <body>
        <h1>Hello, Rust!</h1>
    </body>
</html>
"#;
    println!("{}", html);
}

重點整理

  • 字串字面值可以直接跨行,換行符號會被保留
  • 行尾加 \ 可以接續下一行,同時忽略換行和下一行的前導空白
  • r"..." 是 raw string,不處理任何跳脫字元(\n\\ 等都照原樣保留)
  • r#"..."# 讓 raw string 裡可以包含雙引號
  • # 的層數可以增加(r##"..."##r###"..."###),只要前後一致
  • raw string 特別適合 Windows 路徑、正則表示式、JSON、嵌入程式碼等場景