Çok satırlı bir dize değişmezinin sözdizimi nedir?


Yanıtlar:


173

Tüm dize değişmezleri birkaç satıra bölünebilir; Örneğin:

let string = "line one
line two";

iki satırlı bir dizedir, aynı "line one\nline two"(tabii ki \nsatırsonu kaçışını da doğrudan kullanabilir ). Biçimlendirme nedenlerinden ötürü bir dizgeyi birden çok satıra bölmek isterseniz, satırsonu ve öndeki boşluktan a \; Örneğin:

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

ile aynıdır "one line written over several".

Dizede satır sonu olmasını istiyorsanız, bunları aşağıdakilerden önce ekleyebilirsiniz \:

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

İle aynı "multiple\nlines\nwith\nindentation";


2
Sorun yalnızca okunabilirlikse, concat!()verilen seçenekleri tamamlamak için makroyu eklemek istiyorum ( doc.rust-lang.org/std/macro.concat.html )
hakononakani

83

Tırnaklar, ters eğik çizgiler vb. İçerebilen veya içermeyen biraz daha uzun bir şey yapmak istemeniz durumunda, ham dize değişmez gösterimini kullanın :

let shader = r#"
    #version 330

    in vec4 v_color;
    out vec4 color;

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

Dizenizde çift tırnak ve karma sembol dizileriniz varsa, sınırlayıcı olarak rastgele sayıda karma belirtebilirsiniz:

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

Ancak ... sonuçta yeni satırlar istemiyorsanız yalnızca satırsonlarından kaçmanız gerekir ve ham dizeler buna yardımcı olmaz.
poolie

Ham dizeler, satırsonu satırları umursamıyorsanız (örneğin, gölgelendiriciler ve çekirdekler gibi satırsonu agnostik olan kodu gömdüğünüzde) veya sizin ima ettiğiniz gibi, her satırın sonuna bir '\' eklemenizi engeller. satırsonu gerçekten gerekli olduğunda. Düzenlemek isteyebileceğiniz ve her satırın sonundaki '\' ile uğraşmak zorunda kalmayacağınız kodu gömmeyi kolaylaştırır. Bu kadar.
c0g

1
Ortaya çıkan dizede yeni satırlar istiyorsanız (veya aldırmazsanız), diğer örneklerde gösterildiği gibi düz çift tırnaklı dizeler mükemmel şekilde iş görür. Yeni satırlardan kaçınmak istiyorsanız, ham dizeler işe yaramaz. Gömülü kaynakta olabileceği gibi, yalnızca metin tırnak işaretleri, ters eğik çizgiler, vb. İçeriyorsa yardımcı olurlar.
poolie

2
Şu anda ne elde ettiğini anlıyorum ve kesinlikle haklısın.
c0g

1
Bu dizeleri yazdırmanın çıktısını göstermek yardımcı olacaktır. Cevabın kendisinden yeni satırlarla ne olacağını ve girintinin nasıl işlendiğini söyleyemiyorum.
bluenote10

48

Huon'un cevabı doğrudur, ancak girinti sizi rahatsız ediyorsa, girintili çok satırlı dizeler için prosedürel bir makro olan Indoc'u kullanmayı düşünün . "Girintili belge" anlamına gelir. Çok indoc!()satırlı bir dize değişmezi alan ve en soldaki boşluk olmayan karakterin ilk sütunda olması için girintisini kaldıran adlı bir makro sağlar .

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

Sonuç "line one\nline two\n".

Boşluk, belgedeki en soldaki boşluk olmayan karaktere göre korunur, bu nedenle aşağıdaki satırda birinci satıra göre girintili 3 boşluk vardır:

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

Sonuç "line one\n line two\n".


8

Kodunuzda çok satırlı metni girintilemek istemeniz durumunda:

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

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

Sonuç şu olacaktır:

Multiline text goes next:
first line
second line
third line

Lütfen nesir kullanarak, bu davranış için kodun hangi parçasının önemli olduğunu açıkça belirtin.
Shepmaster

Şu anda, bu , kabul edilen cevaba yeni bir şey eklemiyor gibi görünüyor , ki şu ifade: yeni satır kaçışını kullanabilir \n[...] satırsonu karakterinden ve öndeki boşluktan a ile kaçabilirsiniz{backslash} . (Bir yorumda kodda ters eğik çizgi yazmak çok zor, öyle görünüyor.)
Shepmaster

2
Bu yorum, kabul edilen cevapta iki noktayı birleştirmenin bir yolunu önermektedir: kodda çoklu satırlar olarak yazılan çok satırlı bir diziyi nasıl üretebilirsiniz, ancak aynı zamanda - stilistik veya okunaklılık nedeniyle - son dizede bitmeyen bu girinti olmadan kodda kendi girintisi. Metinde çok net bir şekilde belirtilmemiştir, ancak yaygın bir kullanım durumu ve dolayısıyla değerli bir öneri imho. (Bunun sandık versiyonu için dtolnay tarafından verilen cevaba bakın.)
Dato
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.