ฉันมีปัญหาในการหาวิธีการทำงานของไวยากรณ์สตริงใน Rust โดยเฉพาะฉันกำลังพยายามหาวิธีสร้างสตริงหลายบรรทัด
ฉันมีปัญหาในการหาวิธีการทำงานของไวยากรณ์สตริงใน Rust โดยเฉพาะฉันกำลังพยายามหาวิธีสร้างสตริงหลายบรรทัด
คำตอบ:
ตัวอักษรสตริงทั้งหมดสามารถแบ่งได้หลายบรรทัด ตัวอย่างเช่น:
let string = "line one
line two";
เป็นสตริงสองบรรทัดเหมือนกับ"line one\nline two"(แน่นอนว่าหนึ่งสามารถใช้การขึ้น\nบรรทัดใหม่ได้โดยตรงเช่นกัน) หากคุณต้องการทำลายสตริงในหลาย ๆ บรรทัดด้วยเหตุผลในการจัดรูปแบบคุณสามารถหลีกเลี่ยงการขึ้นบรรทัดใหม่และช่องว่างนำหน้าด้วย a \; ตัวอย่างเช่น:
let string = "one line \
    written over \
    several";
เหมือนกับ"one line written over several".
หากคุณต้องการให้เส้นแบ่งในสตริงคุณสามารถเพิ่มได้ก่อน\:
let string = "multiple\n\
              lines\n\
              with\n\
              indentation";
มันเหมือนกับ "multiple\nlines\nwith\nindentation";
concat!()มาโครเพื่อเติมเต็มตัวเลือกที่กำหนด ( doc.rust-lang.org/std/macro.concat.html )
                    ในกรณีที่คุณต้องการทำอะไรให้ยาวขึ้นเล็กน้อยซึ่งอาจมีหรือไม่มีเครื่องหมายอัญประกาศแบ็กสแลช ฯลฯ ให้ใช้สัญกรณ์อักษรสตริงดิบ :
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##"#
"###;คำตอบของ Huonถูกต้อง แต่ถ้าการเยื้องรบกวนคุณให้พิจารณาใช้Indocซึ่งเป็นมาโครขั้นตอนสำหรับสตริงหลายบรรทัดที่เยื้อง ย่อมาจาก "เอกสารเยื้อง" มีมาโครที่เรียกindoc!()ว่าใช้สตริงแบบหลายบรรทัดและยกเลิกการเยื้องเพื่อให้อักขระที่ไม่ใช่ช่องว่างซ้ายสุดอยู่ในคอลัมน์แรก
let s = indoc! {"
    line one
    line two
"};"line one\nline two\n"ผลที่ได้คือ
ช่องว่างจะถูกเก็บรักษาไว้โดยสัมพันธ์กับอักขระที่ไม่ใช่ช่องว่างด้านซ้ายสุดในเอกสารดังนั้นต่อไปนี้จึงมีช่องว่าง 3 ช่องที่เยื้อง 2 บรรทัดเทียบกับบรรทัดที่หนึ่ง:
let s = indoc! {"
    line one
       line two
"};"line one\n   line two\n"ผลที่ได้คือ
ในกรณีที่คุณต้องการเยื้องข้อความหลายบรรทัดในโค้ดของคุณ:
let s = "first line\n\
    second line\n\
    third line";
println!("Multiline text goes next:\n{}", s);ผลลัพธ์จะเป็นดังนี้:
Multiline text goes next:
first line
second line
third line\nnewline escape [... ] คุณสามารถออกจากบรรทัดใหม่และช่องว่างนำหน้าด้วย a{backslash} . (มันยากมากที่จะพิมพ์แบ็กสแลชในโค้ดในความคิดเห็นมันจะปรากฏขึ้น)
                    หากคุณต้องการควบคุมช่องว่างในสตริงหลายเส้นแบบละเอียดโดยไม่ต้องใช้ลังภายนอกคุณสามารถทำการต่อไปนี้ได้ ตัวอย่างจากโครงการของฉันเอง
impl Display for OCPRecData {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        write!(f, "OCPRecData {{\n\
            \x20   msg: {:?}\n\
            \x20   device_name: {:?}\n\
            \x20   parent_device_name: {:?}\n\
        }}", self.msg, self.device_name, self.parent_device_name)
    }
}ผลลัพธ์ใน
OCPRecData {
    msg: Some("Hello World")
    device_name: None
    parent_device_name: None
}\n\ ที่ปลายบรรทัดรหัสแต่ละบรรทัดจะสร้างตัวแบ่งบรรทัดในตำแหน่งที่เหมาะสมและละทิ้งช่องว่างเพิ่มเติมในบรรทัดของโค้ดนี้\x20 (hex; 32 ในฐานสิบ) คือช่องว่าง ASCII และตัวบ่งชี้สำหรับช่องว่างแรกที่จะรักษาไว้ในบรรทัดของสตริงนี้\x20\x20\x20\x20และ\x20   มีผลเช่นเดียวกัน