Wenn eine Datei zu eng wird
\n\nSie programmieren in Rust. Ihr Projekt wächst. Gestern noch passte alles in main.rs – Funktionen, Strukturen, ein paar Konfigurationen. Und heute brauchen Sie fünf Minuten, um eine bestimmte Funktion zwischen tausend Zeilen zu finden. Kommt Ihnen bekannt vor?
Früher oder später steht jeder Rust-Entwickler vor der Notwendigkeit, den Code in logische Teile zu gliedern. Das klingt einfach: Ordner erstellen, Dateien ablegen, importieren – fertig. Aber das Modulsystem von Rust ist für seine Strenge bekannt. Ein einziger falscher Eintrag in mod.rs – und der Compiler gibt einen Fehler aus, den Sie eine halbe Stunde lang entschlüsseln müssen.
In diesem Artikel analysieren wir die Top-Fehler beim Aufteilen eines Rust-Moduls auf mehrere Dateien und zeigen vor allem, wie Sie sie vermeiden. Sie erfahren, wie Sie die Dateistruktur richtig organisieren, wann Sie mod.rs und wann lib.rs verwenden und warum pub use Ihr bester Freund ist.
Anatomie des Rust-Modulsystems
\n\nBevor wir uns in die Fehler stürzen, erinnern wir uns an die Grundlagen. In Rust ist ein Modul eine Einheit zur Organisation von Code. Standardmäßig ist jede Datei ein Modul, aber so linear ist es nicht.
\n\nEs gibt zwei Ansätze:
\n\n- \n
- Gleichnamige Datei als Modul: Die Datei
utils.rswird automatisch zum Modulutils, wenn Siemod utils;inlib.rsodermain.rsdeklarieren. \n - Verzeichnis als Modul: Ein Ordner
utils/mit einer Dateimod.rsdarin. In diesem Fall istmod.rsder Einstiegspunkt in das Modul. \n
Das klingt einfach, aber genau hier lauern die meisten Fallstricke. Lassen Sie uns die häufigsten durchgehen.
\n\nTop-5 Fehler beim Aufteilen eines Moduls auf mehrere Dateien
\n\nFehler Nr. 1: Untermodul nicht deklariert
\n\nSie haben die Datei network/tcp.rs erstellt und versuchen, sie zu verwenden. Sie schreiben use network::tcp; – und erhalten einen Kompilierungsfehler. Warum? Weil Rust nicht automatisch Ordner durchsucht. Sie müssen jedes Untermodul explizit deklarieren.
// network/mod.rs\n// ❌ Fehler: Untermodul tcp nicht deklariert\n// use network::tcp; // wird nicht kompiliert\n\n// ✅ Richtig:\npub mod tcp; // Untermodul deklarieren\n\n\nWie vermeiden: Überprüfen Sie immer, ob Sie pub mod name_des_untermoduls; im übergeordneten Modul hinzugefügt haben. Dies ähnelt einem expliziten Import – Rust erfordert Klarheit.
Fehler Nr. 2: Verwechslung von mod.rs und lib.rs
\n\nAnfänger platzieren mod.rs oft im Stammverzeichnis des Projekts, neben main.rs. Das funktioniert, aber nur, wenn Sie eine Bibliothek erstellen. Für eine ausführbare Datei (main.rs) ist das Stammmodul main.rs selbst. Und mod.rs ist eine Datei innerhalb eines Ordners.
my_project/\n├── main.rs // Stammmodul für die Binärdatei\n├── lib.rs // Stammmodul für die Bibliothek (falls vorhanden)\n├── utils/\n│ ├── mod.rs // Einstiegspunkt in das Modul utils\n│ └── helpers.rs\n\n\nWie vermeiden: Merken Sie sich die Regel: mod.rs lebt nur innerhalb eines Modul-Ordners. Wenn Sie ein Stammmodul für eine Bibliothek benötigen, verwenden Sie lib.rs.
Fehler Nr. 3: pub in Untermodulen vergessen
\n\nSie haben das Untermodul deklariert, können die Funktion aber trotzdem nicht aufrufen. Wahrscheinlich haben Sie vergessen, pub anzugeben.
// network/mod.rs\npub mod tcp;\n\n// network/tcp.rs\n// ❌ Funktion ist standardmäßig privat\nfn connect() { /* ... */ }\n\n// ✅ Machen Sie sie öffentlich\npub fn connect() { /* ... */ }\n\n\nIn Rust ist standardmäßig alles privat. Das ist kein Fehler, sondern ein Feature: Sie entscheiden selbst, was Sie der Außenwelt zugänglich machen. Wenn die Funktion außerhalb des Moduls benötigt wird, setzen Sie pub.
Wie vermeiden: Verwenden Sie pub bewusst. Lassen Sie interne Hilfsfunktionen privat. Machen Sie API-Funktionen öffentlich.