Verwendung des nicht deklarierten Typs oder Moduls "Std" bei Verwendung in einem separaten Modul

11

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%     
luke 02.05.2014, 18:09
quelle

1 Antwort

30

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. ).

%Vor%

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:

%Vor%

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).

%Vor%

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 ).

%Vor%

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 ).

    
Renato Zannon 02.05.2014, 18:57
quelle

Tags und Links