ProgrammatieRust backend ontwikkelaar

Leg uit hoe het systeem van modules (modules) en zichtbaarheid (pub, pub(crate), private) werkt in Rust. Hoe kan je een groot project organiseren en naamconflicten voorkomen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Het modulesysteem in Rust is gebaseerd op het sleutelwoord mod. Modulen stellen je in staat om code logisch te splitsen over bestanden en naamruimten. Belangrijke punten:

  • Alles is standaard privé (private) binnen het huidige module.
  • pub maakt een element openbaar voor de hele boom van modules.
  • pub(crate) — toegankelijk binnen de hele crate (d.w.z. bibliotheek/project).
  • Naamconflicten worden opgelost door naamruimten: expliciete import (use mod_name::item) en aliassen.

Voor grote projecten wordt aangeraden om een boom van modules te gebruiken met de beschrijving van publieke interfaces alleen via lib.rs of main.rs, de rest is privé:

mod network; mod storage; pub use network::api;

Misleidende vraag

Als een structuur als pub is gedeclareerd, is deze dan toegankelijk voor andere crates?

Antwoord: Nee, het is niet voldoende om de struct als pub te markeren. Het moet ook gedefinieerd zijn in een module die openbaar is voor externe crates (pub mod), en de velden van de structuur moeten openbaar zijn voor directe toegang.

Voorbeeld:

mod foo { pub struct Bar; } // Bar is niet zichtbaar buiten de crate, omdat foo — privé is

Voorbeelden van echte fouten door onwetendheid over de subtiliteiten van het onderwerp


Verhaal

In een project met een complexe modulstructuur werd per ongeluk een structuur als pub gedeclareerd, maar werd de module niet als pub geëxporteerd. Later probeerden ze de structuur uit een andere crate te gebruiken — ze kregen een foutmelding over het niet toegankelijk zijn van het type.

Verhaal

In een grote bibliotheek exporteerden verschillende modules dezelfde namen (bijvoorbeeld types en errors). Bij blind gebruik van use * ontstonden naamconflicten tijdens de compilatie. De oplossing was het toevoegen van aliassen en het importeren van alleen de benodigde elementen.

Verhaal

Veel beginners creëren een pub-structuur, maar laten de velden privé, wat het onmogelijk maakt om deze buiten het module te initialiseren. Hierdoor kon een functie uit een andere module de structuur niet rechtstreeks aanmaken, wat fouten veroorzaakte, totdat de velden of constructeurs openbaar werden gemaakt.