Ich habe den folgenden Code:
%Vor%Ich bekomme Fehler, wenn ich das kompiliere:
%Vor%Das Entfernen des inneren Moduls und das Kompilieren des enthaltenen Codes funktionieren jedoch problemlos:
%Vor%Was fehlt mir hier? Ich bekomme die gleichen Fehler, wenn das Modul in einer separaten Datei ist:
main.rs
%Vor%a.rs
%Vor% Standardmäßig fügt der Compiler extern crate std;
am Anfang des Kistenstamms ein (der Kistenstamm ist die Datei, die Sie an rustc
übergeben). Diese Anweisung bewirkt, dass der Name der Kiste im Root-Namespace mit dem Namen std
verknüpft und mit einem Modul verknüpft wird, das den öffentlichen Inhalt von std
crate enthält.
In untergeordneten Modulen wird std
jedoch nicht automatisch im Namespace des Moduls hinzugefügt. Aus diesem Grund kann der Compiler std
(oder alles, was mit std::
beginnt) in einem Modul nicht auflösen.
Es gibt viele Möglichkeiten, dies zu beheben. Zuerst können Sie use std;
in einem Modul hinzufügen, um den Namen std
in diesem Modul auf den Stamm std
zu verweisen. Beachten Sie, dass in use
-Anweisungen der Pfad als absolut behandelt wird (oder "relativ zum Stamm-Namespace der Kiste"), während überall sonst Pfade relativ zum aktuellen Namespace behandelt werden (sei es ein Modul, eine Funktion usw. ).
Sie können auch eine use
-Anweisung verwenden, um spezifischere Elemente zu importieren. Zum Beispiel können Sie use std::fs::remove_file;
schreiben. Auf diese Weise können Sie vermeiden, dass Sie den gesamten Pfad zu remove_file
eingeben müssen und einfach den Namen remove_file
direkt in diesem Modul verwenden:
Schließlich können Sie use
ganz vermeiden, indem Sie dem Pfad den Pfad mit ::
voranstellen, damit der Compiler den Pfad vom Root-Namespace des Crate auflöst (d. h. den Pfad in einen absoluten Pfad verwandelt).
Die empfohlene Vorgehensweise besteht darin, Typen (Structs, Enums usw.) direkt zu importieren (zB use std::rc::Rc;
, dann den Pfad Rc
), aber Funktionen durch einen Import ihres übergeordneten Moduls zu verwenden (zB use std::io::fs;
, dann benutze den Pfad fs::remove_file
).
Randnotiz: Sie können auch self::
am Anfang eines Pfades schreiben, um es relativ zum aktuellen Modul zu machen. Dies wird häufiger in use
-Anweisungen verwendet, da andere Pfade bereits relativ sind (obwohl sie relativ zum aktuellen -Namespace sind, während self::
immer relativ zum enthaltenden -Modul ).
Tags und Links rust