2015-07-26 7 views
8

Ich habe Schwierigkeiten, einen Fehler in meinem Dokumentationsbeispiel für meine Bibliothek zu beheben. Ich habe die Strukturdatei wie für meine Kiste bignumUngelöster Import in Dokumentationsbeispiel

. 
|-- Cargo.lock 
|-- Cargo.toml 
|-- examples 
| |-- dat 
| | `-- euler_13.dat 
| |-- debug.rs 
| `-- euler_13.rs 
|-- README.md 
|-- src 
| |-- error.rs 
| |-- inits.rs 
| `-- lib.rs 

In meinen Beispielen, meine Header etwas wie

// euler_13.rs 
extern crate bignum; 
use bignum::inits::Zero; 

// ... 

Dies kompiliert und funktioniert gut aussehen, aber jetzt, wenn ich schreibe ein Beispiel innen meine Dokumentation zu lib.rs, kann ich nicht bignum::inits::Zero

//lib.rs 
//... 

impl BigNum { 

    //... 


    /// Constructs a ... 
    /// 
    /// # Examples 
    /// 
    /// ``` 
    /// extern crate bignum; 
    /// use bignum::inits::Zero; 
    /// 
    /// let a = bignum::BigNum::new(Zero::zero()); 
    /// ``` 
    /// 
    pub fn new(base: BigNum) -> BigNum { 
     // ... 
    } 

zu importieren scheinen Wenn ich cargo test laufen, erhalte ich th Fehler ist

 Running target/debug/lib-fe3dd7a75a504b04 

running 3 tests 
test crate_from_u32 ... ok 
test create_from_string ... ok 
test adding_no_carry ... ok 

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured 

    Doc-tests bignum 

running 1 test 
test new_0 ... FAILED 

failures: 

---- new_0 stdout ---- 
    <anon>:3:9: 3:15 error: unresolved import `self::bignum::inits::Zero`. Did you mean `self::self::bignum::inits`? 
<anon>:3  use self::bignum::inits::Zero; 
       ^~~~~~ 
error: aborting due to previous error 
thread 'new_0' panicked at 'Box<Any>', /home/rustbuild/src/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libsyntax/diagnostic.rs:192 



failures: 
    new_0 

ich this Frage gesehen habe, aber diese befasst sich mit Modulen aus der gleichen Datei zu importieren, die noch Toplevel Umfang erfordern. Allerdings gebe ich hier noch den Top-Level-Bereich mit bignum:: an.

So, während der Import bignum::inits::Zero funktioniert für alle meine Tests und Beispiele, funktioniert es nicht für meine Dokumente. Warum das? Ich habe versucht, self:: in Front anzuhängen und den gleichen Fehler zu erhalten. Wenn ich die Doc-Beispiele zu

ändern, kompiliert es aber fein. Wie kann ich meine Module korrekt importieren?

+1

@Shempmaster so während ich denke, dass dies verschiedene Fragen sind, hat die andere Antwort tatsächlich mein Problem gelöst. Ich denke, es liegt daran, dass mein Problem darin besteht, dass 'external create bignum' implizit ist, also wird es wieder Fehler erzeugen. Ich habe ein [Problem] eingereicht (https: // github.com/rust-lang/rost/issues/27301) mit einer Empfehlung zur Änderung der Fehlerausgabe für diese Art von Fehler –

+0

Sicher, ich gehe voran und mache das –

+0

Off-Thema: ist es möglich, meine Kommentare nicht zu entfernen, wenn Ich schlage ein Duplikat vor? Es ist sehr frustrierend, eine Nachricht zu verfassen, nur um sie nach einiger Zeit wieder verschwinden zu lassen. Dies ist das [zweite Mal] (http://stackoverflow.com/questions/31609137/why-are-explicit-lifetimes-needed-in-rust) es passiert. – mdup

Antwort

9

denke ich, das Problem aus dieser useful feature of the doc tests stammt:

rustdoc einen main() Wrapper um Ihren Code, und an der richtigen Stelle automatisch hinzufügen.

Wenn Sie die Regeln in der Verbindung anwenden, beenden Sie Code wie folgt kompilieren:

fn main() { 
    extern crate bignum; 
    use bignum::inits::Zero; 

    let a = bignum::BigNum::new(Zero::zero()); 
} 

Sie würden dann in der Tat, um es als self::bignum verweisen müssen, als die erste Fehlermeldung vorschlägt. Leider funktioniert das momentan nicht wegen Rust issue 23314.

+0

ah, das ist die Erklärung hinter ** warum ** es funktioniert nicht. –

3

Der Grund, warum dieser Fehler generiert wird, läuft auf extern crate bignum hinaus, der implizit von den Dokumentationsbeispielen verwendet wird, was bedeutet, dass ich das Beispiel, das ich verwenden werde, nicht explizit angeben muss bignum.

Dies ist sinnvoll, da auf der Dokumentationsebene Beispiele zeigen, wie die Funktionalität eines bestimmten Teils Ihrer Kiste funktionieren sollte, so dass Sie unabhängig davon bignum verwenden. cargo erkennt dies und importiert bignum für Sie. Was das Beispiel sollte aussehen ist:

//lib.rs 
//... 

impl BigNum { 

    //... 


    /// Constructs a ... 
    /// 
    /// # Examples 
    /// 
    /// ``` 
    /// use bignum::inits::Zero; 
    /// 
    /// let a = bignum::BigNum::new(Zero::zero()); 
    /// ``` 
    /// 
    pub fn new(base: BigNum) -> BigNum { 
     // ... 
    } 
} 
Verwandte Themen