2015-05-10 22 views
55

nasıl türleri aşağıdaki kombinasyonları ard arda:Dizeleri nasıl birleştiririm?

  • str ve str
  • String ve str
  • String ve
+3

'str' ve' str' * farklı tip * olduğunu ve zamanın% 99'unu unutmayın, sadece 'str' ile ilgilenmelisiniz. Aralarındaki farkları detaylandıran başka sorular var. – Shepmaster

cevap

73

dizeleri bitiştirmek String yapmanız bellek ayırması gerekir sonucu sakla. ile başlayan en kolay String ve &str: İşte

fn main() { 
    let mut owned_string: String = "hello ".to_owned(); 
    let borrowed_string: &str = "world"; 

    owned_string.push_str(borrowed_string); 
    println!("{}", owned_string); 
} 

, biz bir sahibi dize mutasyona olabilir ki. Bu, potansiyel olarak bellek ayırmayı yeniden kullanmamıza izin verdiği için etkilidir. String ve String için &Stringcan be dereferenced as &str olarak benzer bir durum var. Bundan sonra

fn main() { 
    let mut owned_string: String = "hello ".to_owned(); 
    let another_owned_string: String = "world".to_owned(); 

    owned_string.push_str(&another_owned_string); 
    println!("{}", owned_string); 
} 

, another_owned_string (hayır mut eleme dikkat edin) bakir. 'un'un String'u tükettiği başka bir varyantı vardır, ancak bunun değişebilir olmasını gerektirmez. Bu sol tarafı olarak bir String ve sağ tarafı olarak bir &str götüren bir implementation of the Add trait geçerli: owned_string artık erişilebilir + çağrısının sonradır

fn main() { 
    let owned_string: String = "hello ".to_owned(); 
    let borrowed_string: &str = "world"; 

    let new_owned_string = owned_string + borrowed_string; 
    println!("{}", new_owned_string); 
} 

Not söyledi.

Yeni bir dize üretmek istediğimizde, her ikisi de el değmemiş mi? Her iki giriş değişkenleri iletmenin

fn main() { 
    let borrowed_string: &str = "hello "; 
    let another_borrowed_string: &str = "world"; 

    let together = format!("{}{}", borrowed_string, another_borrowed_string); 
    println!("{}", together); 
} 

Not, bu yüzden onlar dokundu olmadığını biliyoruz: En basit yolu format! kullanmaktır. gerçi format! kullanmak

fn main() { 
    let owned_string: String = "hello ".to_owned(); 
    let another_owned_string: String = "world".to_owned(); 

    let together = format!("{}{}", owned_string, another_owned_string); 
    println!("{}", together); 
} 

Sen yok yok: Biz String herhangi bir kombinasyonu için aynı şeyi yapmak isteseydik String de biçimlendirilebilir gerçeğini kullanabilirsiniz. Yaptığım tip şartnamenin tüm gereksiz olduğunu - - derleyici burada oyundaki her türlü çıkarabiliriz

fn main() { 
    let owned_string: String = "hello ".to_owned(); 
    let borrowed_string: &str = "world"; 

    let together = owned_string.clone() + borrowed_string; 
    println!("{}", together); 
} 

Not: Sen clone one string ve yeni bir dizeye diğer dize ekleyebilirsiniz. Bu soruyu bu grupta popüler olmasını beklediğimden, onlara sadece Rust'a yeni olanları açıklamak için ekledim!

+4

Bir & str'niz varsa, 'to_owned()' 'to_string()' yerine tercih edilmelidir; std :: fmt 'altyapısını atlayarak daha verimli. –

+0

@ChrisMorgan kesinlikle doğru, ama ben özellikle bu yüksek görüş-sayısı yeni başlayan bir soru olarak beklediğimden, 'to_string' burada hemen daha anlaşılabilir olduğunu düşündüm. Kendi kendime '_ ^' yi tercih ederim. – Shepmaster

+1

'Add' /' + 'sembolü hakkında ne düşünüyorsunuz? İstersen onu koruyabilirsin. – bluss

15

Birden çok dizeyi başka bir karakterle ayrılmış tek bir dizeye birleştirmek için birkaç yol vardır.

Bir dizi join yöntemi kullanıyor gördüğüm en güzel:

fn main() { 
    let a = "Hello"; 
    let b = "world"; 
    let result = [a, b].join("\n"); 

    print!("{}", result); 
} 

kullanımı durumda bağlı olarak da daha fazla kontrol tercih edebilirsiniz:

fn main() { 
    let a = "Hello"; 
    let b = "world"; 
    let result = format!("{}\n{}", a, b); 

    print!("{}", result); 
} 

biraz daha manuel yolları vardır Gördünüz mü, burada bir ya da iki tahsisten kaçınıyorum. Okunabilirlik amaçları için, yukarıdaki iki taneyi yeterli buluyorum.

+0

'join' belgelendirilmiş nerede? Bir Dizi ve bir String arasında yarımca oturur. [Dizi] (https://doc.rust-lang.org/std/primitive.array.html) belgelerini araştırdım ve hızla karıştı. –

+1

@DuaneJ 'join' aslında [' SliceContactExt' özelliği] 'ne eklenmiştir (https://doc.rust-lang.org/std/slice/trait.SliceConcatExt.html). Bu özellik kararsız olarak işaretlenmiştir, ancak yöntemleri kararlı ve [Prelude] 'de yer almaktadır. (Https://doc.rust-lang.org/std/prelude/#prelude-contents) bu nedenle heryerde varsayılan olarak kullanılabilirler. Ekip, bu özelliğin var olmasının gerekmediğini iyi biliyor ve gelecekte onunla birlikte değişeceklerini hayal ediyorum. –