2016-09-05 2 views
2

ich ähnliche Funktionen in einer Datei gruppieren möchten, jedoch müssen diese Funktionen eine Art Rückkehr, die nicht öffentlich ist:Wie referenziert man Typen von Funktionssignaturen in privaten Modulen?

struct MyStruct { 
    // .... 
} 

mod my_mod { 
    pub fn foo() -> super::MyStruct { ... } 
    pub fn bar() -> super::MyStruct { ... } 
    pub fn baz() -> super::MyStruct { ... } 
} 

fn main() { 
    let var = my_mod::foo(); 
} 

Diese error: private type in public interface [E0446] mit dem Fehler fehlschlägt.

Im Allgemeinen ist es sinnvoll, öffentlichen Funktionen nicht zu erlauben, private Typen in ihrer Signatur zu haben. In diesem speziellen Fall ist die Struktur jedoch auf der Root-Ebene der Module verfügbar.

Gibt es eine Möglichkeit, dies zu unterstützen, ohne MyStruct öffentlich zu machen?

Antwort

7

Ich habe das Gefühl, dass dieser Fehler ungerechtfertigt ist. Es sollte nur ein Fehler sein, wenn my_modpub ist oder wenn die Funktionen in einem äußeren Bereich reexportiert werden.

Das sagte, ich fand eine Problemumgehung: Verschieben Sie MyStruct zu einem Geschwistermodul und machen MyStruct Pub, aber nicht das Modul.

mod types { 
    pub struct MyStruct; 
} 

mod my_mod { 
    pub fn foo() -> super::types::MyStruct { unimplemented!() } 
    pub fn bar() -> super::types::MyStruct { unimplemented!() } 
    pub fn baz() -> super::types::MyStruct { unimplemented!() } 
} 

fn main() { 
    let var = my_mod::foo(); 
} 
+2

Es sieht sicherlich aus wie ein Fehler/Einschränkung, ich habe https://github.com/rust-lang/rust/issues/30905 aufgespürt, das scheint in etwa das gleiche Problem zu sein. –

Verwandte Themen