2017-08-20 4 views
1

In meinem lib.rs wollte ich use std::fs::File tun. HierWarum muss ich ein zusätzliches `::` Präfix verwenden, um auf eine importierte Struktur zuzugreifen?

ist der Beispielcode:

use std::fs::File; 
use std::io::Read; 

impl Css { 
    pub fn save_result_to_file(file_to_save: String) { 
     println!("Saving output to {}", file_to_save); 
     let mut f = File::open(file_to_save).expect("Unable to open file"); 
     // let mut f = ::File::open(file_to_save).expect("Unable to open file"); -> Works 
    } 
} 

Ohne die Anwesenheit von :: vor File mir einen Compiler-Fehler bekommen:

| let mut f = File::open(file_to_save).expect("Unable to open file"); 
|       ^^^^^^^^^^ Use of undeclared type or module `File` 

Meine Frage ist - ist der :: Präfix immer notwendig? Ich bin sicher, es ist nicht, aber ich kann nicht sehen, wie das geht.

+0

kann nicht reproduzieren; Sie müssen 'std :: fs :: File;' in der * tatsächlichen * Datei verwenden, in der Sie 'File :: open' aufrufen. – ljedrz

Antwort

3

Sie können denken Sie an die :: Modul Pfadseparator die gleiche Art und Weise wie / in einem Dateipfad, und nur als ein führender / bedeutet das Root-Verzeichnis, ein führender :: bezieht sich auf Ihr Root-Modul der Anwendung.

Wenn Sie ein Element mit use importieren, wird der Name dieses Elements effektiv zu einem (standardmäßig privaten) Element dieses Moduls und kann von anderen Modulen mit absoluten oder relativen Pfaden referenziert werden. Die Tatsache, dass Sie dieses Problem haben, sagt mir, dass Ihre use Anweisungen in Ihrem Stammmodul sind, während der andere Code in einem untergeordneten Modul ist. Aus diesem Grund konnten Kommentatoren von oben den Code, den Sie tatsächlich gepostet haben, nicht reproduzieren.

Sie haben einige Modulstruktur wie folgt aus:

use std::fs::File; 
use std::io::Read; 

mod Foo { 
    struct Css {} 
    impl Css { 
     pub fn save_result_to_file(file_to_save: String) { 
      println!("Saving output to {}", file_to_save); 
      let mut f = ::File::open(file_to_save).expect("Unable to open file"); 
     } 
    } 
} 

Der führende :: notwendig ist, weil File in das Root-Modul importiert wurde, aber Sie verwenden sie in einem Kind-Modul. Wenn Sie den Import in das eigentliche Modul verschieben, die den Code enthält, dann wird es ohne die führende :: gut funktionieren:

mod Foo { 
    use std::fs::File; 
    use std::io::Read; 

    struct Css {} 
    impl Css { 
     pub fn save_result_to_file(file_to_save: String) { 
      println!("Saving output to {}", file_to_save); 
      let mut f = File::open(file_to_save).expect("Unable to open file"); 
     } 
    } 
} 
+0

danke - also wenn ich mehrere 'mod' in einer einzigen Datei habe, muss ich das jedem Mod-Namespace hinzufügen, um es so zu sagen? – abdoe

+0

@abdoe Ja, das stimmt. Rust kümmert sich nicht darum, in welchen Dateien die Module leben, es interessiert nur die Modulstruktur. –

Verwandte Themen