Dizeler (Strings)

Artık Rust'taki iki dize (string) türünü anlayabiliyoruz:

  • &str, &[u8]e benzer şekilde, UTF-8 olarak kodlanmış baytların bir dilimidir (slice).
  • String, Vec<T>ye benzer şekildedir, UTF-8 olarak kodlanmış baytlardan oluşan sahipli bir arabellektir.
fn main() {
    let s1: &str = "Dünya";
    println!("s1: {s1}");

    let mut s2: String = String::from("Merhaba ");
    println!("s2: {s2}");
    s2.push_str(s1);
    println!("s2: {s2}");

    let s3: &str = &s2[s2.len() - s1.len()..];
    println!("s3: {s3}");
}
This slide should take about 10 minutes.
  • &str, bir bellek bloğunda saklanan UTF-8 olarak kodlanmış dize (string) verilerine değiştirilemez (immutable) referans olan bir dize dilimi (string slice) sunar. Dize değişmezleri (string literals) ("Hello"), programın ikili (binary) dosyasında saklanır.

  • Rust'ın String türü, baytlardan oluşan bir vektörün bir sarmalayıcı türüdür. Bir Vec<T> gibi, bu türden veri String türü tarafından sahiplidir (owned).

  • Diğer birçok türde olduğu gibi, String::from() bir dize değişmezinden (string literal) bir string oluşturur; String::new() yeni bir boş dize oluşturur ve dizeye veriler push() ve push_str() metotları kullanılarak eklenebilir.

  • format!() makrosu, dinamik değerlerden sahipli bir dize oluşturmak için uygun bir yoldur. Aynı biçimin println!() makrosundaki gibi aynı biçim tanımlamasını kabul eder.

  • String'den &str dilimlerini (slices) & ve isteğe bağlı olarak aralık seçimi (range selection) ile ödünç alabilirsiniz (barrow). Karakter sınırlarının dışını da kapsayacak bir bayt aralığı seçerseniz, ifade (expression) paniğe neden olacaktır. chars adımlayıcısı, karakterler üzerinde adımlama yapar ve karakter sınırlarını doğru bulmaya çalışmak yerine tercih edilir.

  • C++ programcıları için: &str'yi C++'daki std::string_view olarak düşünün, ancak her zaman bellekteki geçerli bir dizeye işaret eder. Rust dilindeki String, C++'daki std::string'in kabaca eşdeğeridir (ana fark: yalnızca UTF-8 olarak kodlanmış baytlar içerebilir ve asla küçük dize optimizasyonu / small-string optimization kullanmaz).

  • Bayt dizelerinden değişmezler (Byte strings literals), doğrudan bir &[u8] değeri oluşturmanıza olanak tanır:

    fn main() {
        println!("{:?}", b"abc");
        println!("{:?}", &[97, 98, 99]);
    }
  • Ham (raw) dizeler, kaçış karakterlerininin devre dışı bırakıldığı bir &str değeri oluşturmanıza olanak tanır: r"\n" == "\\n". Dizenin içindeki çift tırnakları, dizeyi oluşturan tırnakların her iki tarafınaa eşit sayıda # karakteri koyarak görebilirsiniz:

    fn main() {
        println!(r#"<a href="link.html">link</a>"#);
        println!("<a href=\"link.html\">link</a>");
    }