Cú pháp cho một chuỗi nhiều chữ là gì?


Câu trả lời:


173

Tất cả các chuỗi ký tự có thể được chia thành nhiều dòng; ví dụ:

let string = "line one
line two";

là một chuỗi hai dòng, giống như "line one\nline two"(tất nhiên người ta cũng có thể sử dụng \nlối thoát mới trực tiếp). Nếu bạn muốn chỉ ngắt một chuỗi trên nhiều dòng vì lý do định dạng, bạn có thể thoát khỏi dòng mới và khoảng trắng hàng đầu với a \; ví dụ:

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

cũng giống như "one line written over several".

Nếu bạn muốn ngắt dòng trong chuỗi, bạn có thể thêm chúng trước \:

let string = "multiple\n\
              lines\n\
              with\n\
              indentation";

Nó giống như "multiple\nlines\nwith\nindentation";


2
Nếu chỉ có khả năng đọc là vấn đề, tôi muốn thêm concat!()macro để hoàn thành các tùy chọn đã cho ( doc.rust-lang.org/std/macro.concat.html )
hakononakani

82

Trong trường hợp bạn muốn làm một cái gì đó lâu hơn một chút, có thể bao gồm hoặc không bao gồm dấu ngoặc kép, dấu gạch chéo ngược, v.v., hãy sử dụng ký hiệu chuỗi ký tự thô :

let shader = r#"
    #version 330

    in vec4 v_color;
    out vec4 color;

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

Nếu bạn có chuỗi các dấu ngoặc kép và ký hiệu băm trong chuỗi của mình, bạn có thể biểu thị số lượng băm tùy ý dưới dạng dấu phân cách:

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

Nhưng ... bạn chỉ cần thoát dòng mới nếu bạn không muốn có dòng mới trong kết quả và chuỗi thô không giúp được điều đó.
poolie

Các chuỗi thô chỉ ngăn bạn khỏi phải thêm '\' ở cuối mỗi dòng nếu bạn không quan tâm đến các dòng mới (chẳng hạn như khi bạn nhúng mã không liên quan đến dòng mới như shader và kernel) hoặc, như bạn đã nói để, khi các dòng mới là thực sự cần thiết. Nó chỉ giúp việc nhúng mã dễ dàng hơn mà bạn có thể muốn chỉnh sửa và không phải gặp rắc rối với '\' ở cuối mỗi dòng. Đó là tất cả.
c0g

1
Nếu bạn muốn (hoặc không bận tâm) các dòng mới trong chuỗi kết quả, các chuỗi được trích dẫn kép đơn giản sẽ làm rất tốt, như được hiển thị trong các ví dụ khác. Nếu bạn muốn tránh dòng mới, chuỗi thô là không tốt. Chúng thực sự chỉ có ích nếu văn bản bao gồm dấu ngoặc kép, dấu gạch chéo ngược, v.v. - như có thể xảy ra trong nguồn nhúng.
poolie

2
Tôi thấy những gì bạn nhận được bây giờ và bạn hoàn toàn đúng.
c0g

1
Nó sẽ giúp hiển thị đầu ra của việc in các chuỗi này. Từ câu trả lời, tôi không thể biết điều gì sẽ xảy ra với dòng mới và cách xử lý thụt lề.
bluenote10

48

Câu trả lời của Huon là đúng nhưng nếu vết lõm làm phiền bạn, hãy xem xét sử dụng Indoc , đó là một macro thủ tục cho các chuỗi nhiều dòng thụt lề. Nó là viết tắt của "tài liệu thụt lề." Nó cung cấp một macro được gọi là indoc!()một chuỗi nhiều dòng theo nghĩa đen và bỏ qua nó để ký tự không phải không gian ngoài cùng bên trái nằm trong cột đầu tiên.

let s = indoc! {"
    line one
    line two
"};

Kết quả là "line one\nline two\n".

Khoảng trắng được bảo toàn liên quan đến ký tự không phải không gian ngoài cùng bên trái trong tài liệu, do đó, phần sau có hai dòng được thụt vào 3 khoảng trắng so với dòng một:

let s = indoc! {"
    line one
       line two
"};

Kết quả là "line one\n line two\n".


8

Trong trường hợp bạn muốn thụt lề văn bản nhiều dòng trong mã của mình:

let s = "first line\n\
    second line\n\
    third line";

println!("Multiline text goes next:\n{}", s);

Kết quả sẽ như sau:

Multiline text goes next:
first line
second line
third line

Vui lòng nêu rõ , sử dụng văn xuôi, đoạn mã nào quan trọng đối với hành vi này.
Người quản lý

Ngay bây giờ, điều này dường như không thêm bất cứ điều gì mới vào câu trả lời được chấp nhận , trong đó nêu rõ: người ta có thể sử dụng \nlối thoát mới [...] bạn có thể thoát khỏi dòng mới và khoảng trắng hàng đầu với a{backslash} . (rất khó để nhập một dấu gạch chéo ngược trong mã trong một bình luận, nó xuất hiện.)
Shepmaster

2
Nhận xét này gợi ý cách kết hợp hai điểm trong câu trả lời được chấp nhận: làm thế nào bạn có thể tạo ra một chuỗi nhiều dòng, được viết dưới dạng nhiều dòng trong mã, nhưng đồng thời được cho phép đối với lý do cách điệu hoặc dễ đọc thụt lề riêng của nó trong mã, không có thụt đầu dòng này kết thúc trong chuỗi cuối cùng. Nó không được làm rõ trong văn bản, nhưng nó là một trường hợp sử dụng phổ biến và do đó là một gợi ý có giá trị. (Xem câu trả lời của dtolnay cho phiên bản thùng này.)
Dato
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.