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}"); }
-
&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. BirVec<T>
gibi, bu türden veriString
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 verilerpush()
vepush_str()
metotları kullanılarak eklenebilir. -
format!()
makrosu, dinamik değerlerden sahipli bir dize oluşturmak için uygun bir yoldur. Aynı biçiminprintln!()
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++'dakistd::string_view
olarak düşünün, ancak her zaman bellekteki geçerli bir dizeye işaret eder. Rust dilindekiString
, C++'dakistd::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>"); }