Skip to content
Lektion 53 von 1150/115 abgeschlossen
Modul 14 — Pakete, Crates & Module

Pakete & Crates

Was ist eine Crate?

Eine Crate ist die kleinste Menge an Code, die der Rust-Compiler auf einmal betrachtet. Es gibt zwei Arten:

  • Binary-Crate: kompiliert zu einer ausführbaren Datei (ein main.rs). Jede Binary-Crate hat eine main-Funktion.
  • Library-Crate: kompiliert zu einer Bibliothek (ein lib.rs), die andere Programme importieren können. Sie hat keine main-Funktion.

Was ist ein Paket?

Ein Paket (package) ist ein Bundle aus einer oder mehreren Crates plus einer Cargo.toml-Datei. Ein Paket kann enthalten:

  • eine Binary-Crate oder eine Library-Crate, oder beides
  • mehrere Binary-Crates (in src/bin/)

Standardmäßig interpretiert Cargo src/main.rs als Binary- und src/lib.rs als Library-Crate. src/main.rs ist die Crate-Root — das Modul, in dem alles beginnt.

Die Crate-Root ist der Anfang

Die Crate-Root ist die Quelldatei, von der aus der Compiler startet und aus der dein Modulbaum wächst (src/main.rs oder src/lib.rs). Alles in deiner Crate hängt an dieser Wurzel. Der Compiler beginnt dort und folgt den mod-Deklarationen.

📝 Schnellprüfung

Was ist der Unterschied zwischen einer Binary- und einer Library-Crate?

✅ Wichtige Erkenntnisse

Haken setzen, um deinen Lernfortschritt zu markieren:

Lektion 54 von 1150/115 abgeschlossen
Modul 14 — Pakete, Crates & Module

Module: Kontrolle über Umfang & Sichtbarkeit

Mit mod strukturieren

Module erlauben es, Code in benannte Gruppen zu gliedern und die Privatsphäre zu steuern. Standardmäßig ist alles in einem Modul privat — für Außenstehende unsichtbar:

mod back_of_house {
    fn cook_order() {}
}

fn main() {
    // Fehler: cook_order ist privat!
    // back_of_house::cook_order();
}

Um auf Inhalte eines Moduls zuzugreifen, nutzt man Pfade (paths):

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

fn main() {
    // Absoluter Pfad (mit crate::)
    crate::front_of_house::hosting::add_to_waitlist();
    // Relativer Pfad (ohne crate::)
    front_of_house::hosting::add_to_waitlist();
}

pub macht ein Item öffentlich. Wichtig: pub auf einem Modul macht das Modul sichtbar, aber nicht automatisch dessen Inhalte — jedes Item braucht sein eigenes pub.

Privat by default

In Rust ist alles privat, solange du nicht pub sagst. Das Gegenteil vieler anderer Sprachen. Diese Regel zwingt dich, bewusst zu entscheiden, was Teil deiner öffentlichen API wird — ein Kernstück von Rusts "safe by default" Philosophie.

📝 Schnellprüfung

Was macht das pub-Schlüsselwort bei einem Modul?

✅ Wichtige Erkenntnisse

Haken setzen, um deinen Lernfortschritt zu markieren:

Lektion 55 von 1150/115 abgeschlossen
Modul 14 — Pakete, Crates & Module

use: Pfade in den Scope holen

use verkürzt Pfade

Statt jedes Mal den vollen Pfad zu schreiben, holst du ein Item mit use in den Scope:

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

use crate::front_of_house::hosting;

fn main() {
    hosting::add_to_waitlist();
}

Danach schreibst du hosting::add_to_waitlist() statt des vollen Pfads.

Konventionen

  • Funktionen: use des Elternmoduls (nicht der Funktion), damit klar bleibt, woher sie kommt — hosting::add_to_waitlist().
  • Structs/Enums: use des vollen Pfadsuse std::collections::HashMap; dann HashMap::new().
  • Aliase bei Namenskollision: use std::io::Result as IoResult;.

Warum Elternmodul für Funktionen?

Bei Funktionen hält man das Elternmodul im Scope: hosting::add_to_waitlist() zeigt, dass die Funktion woanders definiert ist. Bei Structs/Enums holt man den vollen Pfad — dort gibt es keinen übergeordneten "Ort", der wichtig wäre. Das sind Konventionen, keine Regeln; Rust akzeptiert beides.

📝 Schnellprüfung

Wie holt man konventionsgemäß eine Funktion in den Scope?

✅ Wichtige Erkenntnisse

Haken setzen, um deinen Lernfortschritt zu markieren:

Lektion 56 von 1150/115 abgeschlossen
Modul 14 — Pakete, Crates & Module

Mehrere Dateien: Module aufteilen

Module in separate Dateien auslagern

Wächst dein Modul, legst du es in eine eigene Datei. Aus

// lib.rs
mod front_of_house {
    pub mod hosting { /* ... */ }
}

wird:

// lib.rs
mod front_of_house;
// Inhalt liegt jetzt in src/front_of_house.rs

Rust sucht den Inhalt von front_of_house dann in src/front_of_house.rs.

Modul-Bäume mit Verzeichnissen

Hat ein Modul Untermmodule, nutzt du ein Verzeichnis:

// lib.rs
mod front_of_house;
// src/front_of_house/mod.rs
pub mod hosting;
// src/front_of_house/hosting.rs

mod front_of_house; sucht zuerst src/front_of_house.rs, dann src/front_of_house/mod.rs. (Die mod.rs-Variante ist älter; heute bevorzugt man front_of_house.rs neben einem front_of_house/-Ordner.)

Der Compiler folgt den mod-Deklarationen

Die Crate-Root ist der einzige Ort, den Cargo kennt. Von dort folgt der Compiler den mod-Deklarationen und lädt die passenden Dateien. Deshalb musst du jede Datei über eine Kette von mod-Anweisungen von der Root aus erreichbar machen — nur Dateien im Modulbaum werden kompiliert.

📝 Schnellprüfung

Wo sucht Rust den Inhalt von 'mod front_of_house;'?

✅ Wichtige Erkenntnisse

Haken setzen, um deinen Lernfortschritt zu markieren:

Lektion 57 von 1150/115 abgeschlossen
Modul 14 — Pakete, Crates & Module

Sichtbarkeit: pub, pub(crate) & Freunde

Feinstufige Sichtbarkeit

Neben pub (für alle sichtbar) und privat (nur im Modul) gibt es Abstufungen:

  • pub(crate) — sichtbar innerhalb der gesamten Crate, aber nicht von außen
  • pub(super) — sichtbar im Elternmodul
  • pub(in path) — sichtbar innerhalb eines bestimmten Pfads
mod geheim {
    pub(crate) fn intern() {}   // überall in der Crate nutzbar
    pub(super) fn im_eltern() {} // nur im Elternmodul
    fn privat() {}               // nur hier
}

Sichtbarkeit nach außen

Für eine Library-Crate gilt: pub macht ein Item zur öffentlichen API für andere Crates. Alles, was du als pub markierst, ist ein Versprechen an deine Nutzer — Änderungen daran brechen deren Code. Wähle die öffentliche API bewusst.

Weniger pub = mehr Freiheit

Je weniger du öffentlich machst, desto freier kannst du später intern umstrukturieren. pub(crate) ist ein guter Kompromiss: Item ist überall in deiner Crate nutzbar, aber nicht Teil der öffentlichen API — du kannst es ändern, ohne deine Nutzer zu brechen.

📝 Schnellprüfung

Was bedeutet pub(crate)?

✅ Wichtige Erkenntnisse

Haken setzen, um deinen Lernfortschritt zu markieren:

Lektion 58 von 1150/115 abgeschlossen
Modul 14 — Pakete, Crates & Module

Re-Exporte & Modul-Baum-Pflege

pub use für Re-Exporte

Ein Re-Export stellt ein Item an einem anderen Ort bereit:

mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

// Re-Export: macht add_to_waitlist direkt hier verfügbar
pub use crate::front_of_house::hosting::add_to_waitlist;

fn main() {
    add_to_waitlist();
}

Nutzer schreiben dann add_to_waitlist() statt front_of_house::hosting::.... Re-Exporte sind ideal, um eine übersichtliche öffentliche API zu bauen, während die interne Struktur frei bleibt.

Deine API gestalten

  • Exportiere das, was Nutzer brauchen, unter einem klaren Namen
  • Halte interne Module privat und strukturiere frei um
  • Re-Exporte trennen interne Organisation von öffentlicher Oberfläche

Innen frei, außen klar

Der Modulbaum hat zwei Rollen: intern hilft er dir, Code zu organisieren; extern ist er deine API. Mit pub use entkoppelst du beide: Innen strukturierst du, wie es wartbar ist, außen zeigst du eine klare, stabile Schnittstelle.

📝 Schnellprüfung

Wozu dient ein Re-Export mit 'pub use'?

✅ Wichtige Erkenntnisse

Haken setzen, um deinen Lernfortschritt zu markieren:

Lektion 59 von 1150/115 abgeschlossen
Modul 14 — Pakete, Crates & Module

Übung: Ein Restaurant-Backend strukturieren

Projekt: Module wie in einem echten Projekt

Du strukturierst ein kleines Programm nach den Regeln dieses Moduls:

  1. Definiere ein Modul kueche mit einem öffentlichen Untermodul bestellung.
  2. Lege im Untermodul eine Funktion bestellen(gericht: &str) an, die den Gerichtsnamen ausgibt.
  3. Hole die Funktion mit use in den Scope und rufe sie in main auf.
  4. Markiere eine Hilfsfunktion als pub(crate) und eine andere als privat — und prüfe, dass die private von außen nicht erreichbar ist.
  5. Überlege: Welche Items wären Teil deiner öffentlichen API, wenn das eine Library-Crate wäre?

Das verbindet mod, pub, Pfade, use und Sichtbarkeit zu einem Ganzen.

Rezepte aus diesem Modul

  • Modul anlegen: mod name { ... } oder mod name; (Datei)
  • Sichtbar machen: pub, pub(crate), pub(super)
  • Pfad holen: use pfad::zu::item;
  • Neu bereitstellen: pub use pfad::zu::item;

Übung: Restaurant-Backend strukturieren

🧩 Übung m14-l7-e1

🔮 Vorhersage: Was passiert beim Ausführen?

Editor wird geladen…
KI-Tutor (sokratisch — keine Komplettlösungen)

✅ Wichtige Erkenntnisse

Haken setzen, um deinen Lernfortschritt zu markieren:

Modul-Checkpoint

Bestehe das Modul mit 80 %. Der Versuch zählt — beantwortete Fragen werden nicht erneut angezeigt; erst nach dem Absenden gibt es Auflösung und Erklärung.

Checkpoint: Modul 14 — Pakete, Crates & Module

Bestehensgrenze: 80 %. Der Versuch wird bewertet und zählt für das Modul-Gate.

This site uses essential cookies for Stripe payments. No tracking cookies.