String vs str in Rust: Hauptunterschiede mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

String vs str in Rust: Warum Anfänger verwirrt sind und wie man es ein für alle Mal versteht

\n\n

Wenn Sie gerade erst anfangen, Rust zu lernen, sind Sie sicherlich schon auf folgende Situation gestoßen: Der Compiler meckert, Sie versuchen ein String dort zu übergeben, wo ein &str erwartet wird, oder umgekehrt. Kommt Ihnen bekannt vor? Dies ist eine der häufigsten Fragen auf Stack Overflow (tausende Aufrufe!), und das aus gutem Grund – das Thema ist wirklich grundlegend für das Verständnis der Speicherverwaltung in Rust.

\n\n

In diesem Artikel werden wir uns ansehen, worin sich String und &str unterscheiden, wann welcher Typ verwendet werden sollte und wie man typische Fehler vermeidet. Los geht's!

\n\n

Kurze Antwort für Eilige

\n\n

Wenn Sie es jetzt sofort brauchen – merken Sie sich das Wichtigste:

\n\n
    \n
  • String ist ein besitzender, veränderlicher, dynamischer Datentyp, der auf dem Heap gespeichert wird.
  • \n
  • &str ist ein unveränderlicher String-Slice, der auf Daten verweist, die jemand anderem gehören. Meistens tritt er als &str auf.
  • \n
\n\n

Jetzt tauchen wir tiefer ein.

\n\n

Was ist String in Rust?

\n\n

String ist ein Typ, der Besitzer seiner Daten ist. Wenn Sie einen String erstellen, wird Speicher dafür auf dem Heap reserviert, und der String kann wachsen, schrumpfen oder verändert werden.

\n\n
let mut s = String::from("Hallo");\ns.push_str(", Welt!");\nprintln!("{}", s); // Gibt aus: Hallo, Welt!
\n\n

Hier ist s der Besitzer des Strings. Wenn s den Gültigkeitsbereich verlässt, wird der Speicher automatisch freigegeben (dank RAII – Resource Acquisition Is Initialization).

\n\n

Hauptmerkmale von String:

\n
    \n
  • Besitzt die Daten (besitzender Typ)
  • \n
  • Veränderbar (mutable)
  • \n
  • Wird auf dem Heap gespeichert
  • \n
  • Kann aus einem String-Literal erstellt werden: String::from("Text")
  • \n
  • Unterstützt Verkettung, Einfügen, Löschen von Zeichen
  • \n
\n\n

Was ist &str in Rust?

\n\n

&str (ausgesprochen als "Str-Slice" oder "String-Slice") ist ein Verweis auf eine Sequenz von UTF-8-Zeichen, die jemand anderem gehört. &str selbst ist lediglich ein Zeiger auf die Daten und die Länge.

\n\n
let greeting: &str = "Hallo";\nprintln!("{}", greeting);
\n\n

In diesem Beispiel ist greeting ein Verweis auf ein String-Literal, das direkt in der Binärdatei des Programms gespeichert ist (im Read-Only-Speichersegment). greeting besitzt diese Daten nicht – es zeigt nur darauf.

\n\n

Hauptmerkmale von &str:

\n
    \n
  • Besitzt die Daten nicht (geliehener Typ)
  • \n
  • Unveränderbar (immutable)
  • \n
  • Wird entweder in der Binärdatei (String-Literale) oder auf dem Heap (als Slice eines String) gespeichert
  • \n
  • Leichtgewichtig – besteht aus zwei Feldern: Zeiger + Länge (16 Bytes auf einem 64-Bit-System)
  • \n
  • Ideal zur Übergabe an Funktionen, wenn der String nicht verändert werden muss
\n\n

Hauptunterschiede zwischen String und &str (Tabelle)

\n\n

Fassen wir alles in einer übersichtlichen Tabelle zusammen:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MerkmalString&str
BesitzBesitzt die DatenLeiht sich die Daten
VeränderbarkeitJa (mut)Nein
SpeicherortHeapHeap, Stack oder Binärdatei
Größe auf dem Stack24 Bytes (ptr + len + cap)16 Bytes (ptr + len)
ErstellungString::from("...")"..." oder &s[..]
HauptverwendungWenn der String verändert oder in

Blogs

Buchempfehlungen