Initialisierung von Strukturen in Rust: Schnellstart und fortgeschrittene Tricks

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

Einleitung: Warum die Initialisierung von Strukturen in Rust nicht langweilig ist?

\n\n

Wenn Sie jemals in Rust geschrieben haben, sind Sie sicherlich auf den Moment gestoßen, in dem Sie sagen möchten: „Warum muss ich immer wieder field: field schreiben? Das ist doch offensichtlich!“.

\n\n

Ja, Rust ist eine strenge, disziplinierte und unglaublich ausdrucksstarke Sprache. Aber selbst darin gibt es Platz für syntaktischen Zucker, der den Code kürzer, sauberer und angenehmer für das Auge macht. Dies betrifft insbesondere die Initialisierung von Strukturen – genau diese Routine, die wir dutzende Male am Tag durchführen.

\n\n

In diesem Artikel beantworten wir nicht nur die beliebte Frage von Stack Overflow: „Gibt es einen schnelleren/kürzeren Weg, Variablen in einer Rust-Struktur zu initialisieren?“. Wir werden alle Methoden durchgehen – von den grundlegenden bis zu den fortgeschrittenen – und zeigen, wie man Code schreibt, der gleichzeitig schnell, lesbar und „rustisch“ (idiomatic Rust) ist.

\n\n

Bereit, Ihre Arbeit mit Rust struct zu beschleunigen? Los geht's!

\n\n

1. Die klassische Methode: Explizite Benennung der Felder

\n\n

Beginnen wir mit den Grundlagen. Angenommen, wir haben eine Struktur User:

\n\n
struct User {\n    username: String,\n    email: String,\n    sign_in_count: u64,\n    active: bool,\n}
\n\n

Die Standardinitialisierung sieht so aus:

\n\n
let user1 = User {\n    email: String::from("someone@example.com"),\n    username: String::from("someusername123"),\n    active: true,\n    sign_in_count: 1,\n};
\n\n

Alles ehrlich, alles explizit. Aber wenn Sie 10-15 Felder haben und die Variablennamen mit den Feldnamen übereinstimmen – das beginnt zu nerven. Sie schreiben email: email und fühlen sich wie ein Bürokrat, der ein Formular ausfüllt.

\n\n

Gute Nachricht: Rust fühlt das auch. Und hat eine Lösung gefunden.

\n\n

2. Field Init Shorthand: Wenn der Variablenname mit dem Feld übereinstimmt

\n\n

Seit Rust 1.17 können Sie eine verkürzte Schreibweise verwenden, wenn der Variablenname mit dem Feldnamen der Struktur übereinstimmt. Dies nennt man field init shorthand.

\n\n
let email = String::from("someone@example.com");\nlet username = String::from("someusername123");\n\nlet user1 = User {\n    email,  // statt email: email\n    username, // statt username: username\n    active: true,\n    sign_in_count: 1,\n};
\n\n

Schön, oder? Rust versteht selbst, dass email sowohl die Variable als auch das Feld ist. Dieser Trick ist besonders praktisch, wenn Sie Funktionsparameter übergeben, die bereits sinnvoll benannt sind.

\n\n

Wann verwenden: immer, wenn der Variablenname mit dem Feldnamen übereinstimmt. Das ist nicht nur „schneller zu schreiben“, es ist idiomatisches Rust.

\n\n

3. Struct Update Syntax: Struktur mit Änderungen kopieren

\n\n

Angenommen, wir haben bereits user1 und möchten user2 erstellen, wobei wir nur die E-Mail ändern. Müssen wir wirklich alle Felder neu schreiben? Nein!

\n\n
let user2 = User {\n    email: String::from("another@example.com"),\n    ..user1  // restliche Felder werden von user1 übernommen\n};
\n\n

Der Operator .. ist die struct update syntax. Er sagt dem Compiler: „Nimm alle verbleibenden Felder von user1“. Wichtig: user1 wird danach teilweise verschoben (wenn die Felder Copy nicht implementieren), also seien Sie vorsichtig mit dem Eigentum.

\n\n

Diese Syntax spart eine Menge Zeilen, wenn Sie mit der Initialisierung von Strukturen in Rust auf Basis vorhandener Daten arbeiten.

\n\n

4. Das Default-Trait: Initialisierung mit Standardwerten

\n\n

Was ist, wenn die meisten Felder Standardwerte haben sollen? Zum Beispiel active: true und sign_in_count: 0? Sie können das Default-Trait implementieren:

\n\n
#[derive(Default)]\nstruct User {\n    username: String,\n    email: String,\n    active: bool,\n    sign_in_count: u64,\n}\n\n// Jetzt:\nlet user_default = User::default();\n// username: "", email: "", active: false, sign_in_count: 0
\n\n

Aber halt!

Blogs

Buchempfehlungen