A Rust kétféleképpen valósítja meg a karakterek tömbjét: a str és a String típussal.
A str-t, más néven »string slice«-t, általában referenciával együtt, &str alakban használjuk.
Ahhoz, hogy megértsük, miért, hasznos megérteni, miért nem fordul le a következő kódsor
const MY_CONST: str = *"Hello, World!";
// the size for values of type `str` cannot be known at compilation time
// the trait `Sized` is not implemented for `str`
Bár a „Hello, World!” literál hossza fordítási időben ismert lehet, str-ként egy ismeretlen méretű sorozat.
De egy literál referenciájaként (&str) van egy „kövér mutatója”, amely a literál memóriabeli címét és hosszát tárolja.
A kövér mutatók mérete ismert, így ez a sor le fog fordulni
const MY_CONST: &str = "Hello, World!";
A string slice-hoz tartozó módosítható kötés értéke lecserélhető, de helyben nem módosítható.
Példa
let mut my_str = "Hello, World!";
my_str = "Hi!";
let mut my_string = String::from("Hello");
my_string.push_str(", World!"); // there is no equivalent function to modify &str
Kevésbé korlátozó, ha egy függvény paramétereként &str-t használunk &String helyett, mert ez így nem fordul le
pub fn main() {
let my_str: &str = "Hello, World!";
say_hi(my_str);
}
fn say_hi(phrase: &String) {
println!("{phrase:?}");
}
// mismatched types
// expected reference `&String`
// found reference `&str`
A &str nem alakul át automatikus típuskonverzióval &String-gé. Ez viszont le fog fordulni
pub fn main() {
let my_string = String::from("Hello, World!");
say_hi(&my_string)
}
fn say_hi(phrase: &str) {
println!("{phrase:?}");
}
A &String ezzel szemben átalakul &str-ré. Így gyakran hasznosabb a &str paramétertípust használni.