ฉันมีปัญหาในการหาวิธีการทำงานของไวยากรณ์สตริงใน 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
\n
newline 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
มีผลเช่นเดียวกัน