Wie man ein Modul aus einer anderen Datei in Rust einbindet: Vom Anfänger zum sicheren Anwender
\n\nHaben Sie jemals Code in Rust geschrieben und plötzlich festgestellt, dass Ihre main.rs sich in ein 500-Zeilen-Monster verwandelt? Kommt Ihnen bekannt vor? Oder vielleicht fangen Sie gerade erst an, Rust zu lernen, und möchten verstehen, wie Sie Code richtig organisieren, indem Sie ihn auf mehrere Dateien aufteilen. Die Frage "How can I include a module from another file from the same project?" ist eine der beliebtesten auf Stack Overflow, und das aus gutem Grund. Das modulare System von Rust ist gleichzeitig leistungsstark und... für Anfänger etwas ungewohnt.
In diesem Artikel werden wir alles von A bis Z durchgehen: wie man ein Modul erstellt, wie man es einbindet, welche Fallstricke es gibt und wie man Fehler vermeidet. Los geht's!
\n\nWarum sind Module in Rust nicht einfach ein "include"?
\n\nWenn Sie von Python oder JavaScript kommen, sind Sie import oder require gewohnt. In Rust ist das etwas anders. Es gibt kein magisches "Datei aufgreifen und verwenden". Stattdessen verwendet Rust ein deklaratives Modulsystem. Sie müssen dem Compiler explizit mitteilen: "Hey, diese Datei ist Teil meines Projekts, und so heißt sie."
Die grundlegende Regel, die Sie sich merken sollten, lautet: Jede Datei ist ein Modul, aber nicht jedes Modul ist eine Datei. Klingt wie ein Rätsel, oder? Das klären wir jetzt.
\n\nProjektstruktur: Wo fängt man an?
\n\nAngenommen, Sie haben ein Projekt mit dieser Struktur:
\n\nmy_project/\n├── Cargo.toml\n├── src/\n│ ├── main.rs\n│ ├── greetings.rs\n│ └── utils/\n│ ├── mod.rs\n│ └── helpers.rs\n\nHier ist greetings.rs ein einfaches Modul und utils/ ein Ordner mit einem Modul. Lassen Sie uns lernen, wie man sie einbindet.
Methode 1: Einbinden einer einfachen Datei als Modul
\n\nDer einfachste Fall. Sie haben greetings.rs mit einer Funktion:
// greetings.rs\npub fn say_hello() {\n println!("Hallo aus dem Modul greetings!");\n}\n\nUm dieses Modul in main.rs zu verwenden, müssen Sie zwei Dinge tun:
- \n
- Das Modul deklarieren mit dem Schlüsselwort
mod\n - Die benötigten Elemente importieren mit
use\n
// main.rs\nmod greetings; // Modul deklarieren\n\nuse greetings::say_hello; // Funktion importieren\n\nfn main() {\n say_hello(); // verwenden\n}\n\nDas war's! Rust sucht automatisch nach der Datei greetings.rs im selben Ordner wie main.rs. Wenn die Datei gefunden wird, ist das Modul eingebunden.
Wichtig: Die Funktion say_hello ist als pub markiert. Wenn Sie pub vergessen, teilt Ihnen der Compiler mit, dass die Funktion privat und von außen nicht zugänglich ist. Dies ist einer der häufigsten Fehler von Anfängern.
Methode 2: Modul in einem Ordner (mod.rs oder lib.rs)
\n\nWenn Ihr Projekt wächst, ist es praktisch, Module in Ordnern zu gruppieren. Dazu wird die Datei mod.rs innerhalb des Ordners verwendet. Sie dient als "Einstiegspunkt" in das Modul.
Erstellen wir den Ordner utils/ und darin mod.rs:
// utils/mod.rs\npub mod helpers; // verschachteltes Modul deklarieren\n\nJetzt erstellen wir helpers.rs:
// utils/helpers.rs\npub fn do_something() {\n println!("Etwas Nützliches tun");\n}\n\nIn main.rs binden wir es so ein:
// main.rs\nmod utils; // Modul utils deklarieren (sucht nach utils/mod.rs)\n\nuse utils::helpers::do_something;\n\nfn main() {\n do_something();\n}\n\nBeachten Sie: mod utils; sagt Rust, dass es nach utils/mod.rs oder utils.rs suchen soll. Wenn es mod.rs findet – großartig, wenn utils.rs – auch in Ordnung. Aber Sie dürfen nicht beide Dateien gleichzeitig haben – der Compiler würde verwirrt werden.