Неразрешенный импорт в примере документации
У меня проблемы с исправлением ошибки в моем примере документации для моей библиотеки. У меня есть структура файла, как для моего ящика 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 {
// ...
}
}