Неразрешенный импорт в примере документации

У меня проблемы с исправлением ошибки в моем примере документации для моей библиотеки. У меня есть структура файла, как для моего ящика bignum

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

В моих примерах мои заголовки будут выглядеть примерно так

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

// ...

Это компилируется и прекрасно работает, но теперь, когда я пишу пример в моей документации на lib.rsЯ не могу импортировать 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 {
        // ...
    }

Когда я бегу cargo testЯ получаю эту ошибку

     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

Я видел этот вопрос, но он касается импорта модулей из одного и того же файла, который все еще требует для расширения области действия. Однако здесь я все еще указываю область верхнего уровня с bignum::,

Так что при импорте bignum::inits::Zero работает для всех моих тестов и примеров, это не работает для моих документов. Это почему? Я пытался добавить self:: впереди и получите ту же ошибку. Если я изменю примеры документов на

extern crate bignum;

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

однако компилируется нормально. Как я могу правильно импортировать мои модули?

2 ответа

Решение

Я думаю, что проблема связана с этой полезной функцией док-тестов:

rustdoc автоматически добавит main() Обертка вокруг вашего кода, и в нужном месте.

Если вы применяете правила в ссылке, вы в конечном итоге компилируете код следующим образом:

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

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

Тогда вам действительно нужно будет сослаться на это как self::bignum, как следует из первого сообщения об ошибке. К сожалению, в настоящее время это не сработает из-за проблемы Rust 23314.

Таким образом, причина этой ошибки сводится к extern crate bignum неявно используется примерами документации, что означает, что мне не нужно явно указывать пример, который я буду использовать bignum,

Это имеет смысл, потому что на уровне документации примеры показывают, как должна работать функциональность определенной части вашего ящика, поэтому вы будете использовать bignum несмотря на. груз признает это и импортирует bignum для тебя. Пример должен выглядеть следующим образом:

//lib.rs
//...

impl BigNum {

    //...


    /// Constructs a ...
    ///
    /// # Examples
    ///
    /// ```
    /// use bignum::inits::Zero;
    ///
    /// let a = bignum::BigNum::new(Zero::zero());
    /// ```
    ///
    pub fn new(base: BigNum) -> BigNum {
        // ...
    }
}
Другие вопросы по тегам