Rust bietet zwei Haupt-String-Typen, &str und String, die jeweils für unterschiedliche Anforderungen optimiert sind.
In diesem Tutorial lernen wir die verschiedenen String-Typen in Rust kennen, wie sie sich unterscheiden und wann sie verwendet werden sollten.
Die zwei String-Typen in Rust sind:
str
(String-Slice) String
str
TypDer Typ str
(auch als String-Slice bekannt) ist eine Art unveränderliche Zeichenkette. Es handelt sich um eine Ansammlung von Textdaten, die in der Regel durch Referenzen (&str
) verwendet wird. Im Gegensatz zu String
ist str
eine "borrowed" (geliehene) Zeichenkette, was bedeutet, dass der Speicherort, auf den es verweist, nicht durch das str
-Objekt selbst verwaltet wird.
&str
fn main() {
let text: &str = "Hello, Rust!";
println!("{}", text);
}
Wichtige Eigenschaften von &str
:
- Unveränderlich: Ein &str
-Slice kann nicht direkt modifiziert werden.
- Borrowed (geliehen): Der Speicher, auf den ein &str
verweist, wird nicht durch &str
verwaltet, sondern vom Besitzer des ursprünglichen Strings.
- Effizient: Da &str
unveränderlich ist und keine Speicherzuweisung erfolgt, ist es sehr speicher- und laufzeitfreundlich.
&str
In Rust sind String-Literale, wie "Hello, World!"
, vom Typ &str
. Sie sind fest in das Programm eingebettet und somit unveränderlich.
fn main() {
let literal = "I am an immutable string slice"; // `literal` ist vom Typ `&str`
println!("{}", literal);
}
String
TypDer String
-Typ ist eine eigentümliche (owned) Zeichenkette, die im Heap gespeichert wird. String
ist dynamisch und erlaubt es, Zeichenketten zur Laufzeit zu erstellen und zu ändern.
String
fn main() {
let mut my_string = String::from("Hello, ");
my_string.push_str("Rust!"); // Modifiziert den String
println!("{}", my_string);
}
Wichtige Eigenschaften von String
:
- Veränderlich: Ein String
kann nachträglich modifiziert werden.
- Owned (Eigentümer): Der String
-Typ besitzt den Speicher und verwaltet ihn automatisch (z. B. mit automatischem Speicherfreigeben via Rusts Ownership-Modell).
- Heap-gespeichert: Der Speicher wird dynamisch im Heap zugewiesen, was bedeutet, dass die Größe des Strings zur Laufzeit wachsen oder schrumpfen kann.
Es gibt verschiedene Möglichkeiten, einen String
in Rust zu erstellen:
String::from
fn main() {
let s = String::from("Hello, World!");
println!("{}", s);
}
to_string
fn main() {
let s = "Hello".to_string();
println!("{}", s);
}
String
erstellenfn main() {
let mut empty_string = String::new(); // Ein leerer String
empty_string.push_str("Füge Text hinzu!"); // Text hinzufügen
println!("{}", empty_string);
}
&str
und String
Da &str
und String
unterschiedliche Eigenschaften haben, muss manchmal zwischen ihnen konvertiert werden.
&str
zu String
Es gibt mehrere Möglichkeiten, ein &str
in einen String
zu konvertieren:
String::from
fn main() {
let s: &str = "Hello, Rust!";
let s_string = String::from(s);
println!("{}", s_string);
}
to_string
fn main() {
let s: &str = "Hello, Rust!";
let s_string = s.to_string();
println!("{}", s_string);
}
String
zu &str
Ein String
kann leicht in ein &str
konvertiert werden, indem eine Referenz auf den String
genommen wird:
fn main() {
let s: String = String::from("Hello, Rust!");
let s_slice: &str = &s; // Eine Referenz auf den `String`
println!("{}", s_slice);
}
&str
und wann String
?&str
:String
: