文档示例中未解决的导入
Unresolved import in documentation example
我很难修复我的库的文档示例中的错误。我的文件结构类似于我的板条箱 bignum
.
|-- Cargo.lock
|-- Cargo.toml
|-- examples
| |-- dat
| | `-- euler_13.dat
| |-- debug.rs
| `-- euler_13.rs
|-- README.md
|-- src
| |-- error.rs
| |-- inits.rs
| `-- lib.rs
在我的示例中,我的 headers 看起来像
// 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());
但是它编译得很好。如何正确导入我的模块?
所以产生这个错误的原因归结为 extern crate bignum
被文档示例隐式使用,这意味着我不需要明确告诉示例我将使用 bignum
。
这是有道理的,因为在文档级别,示例显示了您的 crate 特定部分的功能应该如何工作,因此您将无论如何使用 bignum
。 cargo 识别这一点并为您导入 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 {
// ...
}
}
我认为问题源于此useful feature of the doc tests:
rustdoc will automatically add a main()
wrapper around your code, and in the right place.
如果您应用 link 中的规则,您最终会编译如下代码:
fn main() {
extern crate bignum;
use bignum::inits::Zero;
let a = bignum::BigNum::new(Zero::zero());
}
然后您确实需要将其称为 self::bignum
,如第一条错误消息所示。不幸的是,由于 Rust issue 23314.
目前无法使用
我很难修复我的库的文档示例中的错误。我的文件结构类似于我的板条箱 bignum
.
|-- Cargo.lock
|-- Cargo.toml
|-- examples
| |-- dat
| | `-- euler_13.dat
| |-- debug.rs
| `-- euler_13.rs
|-- README.md
|-- src
| |-- error.rs
| |-- inits.rs
| `-- lib.rs
在我的示例中,我的 headers 看起来像
// 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());
但是它编译得很好。如何正确导入我的模块?
所以产生这个错误的原因归结为 extern crate bignum
被文档示例隐式使用,这意味着我不需要明确告诉示例我将使用 bignum
。
这是有道理的,因为在文档级别,示例显示了您的 crate 特定部分的功能应该如何工作,因此您将无论如何使用 bignum
。 cargo 识别这一点并为您导入 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 {
// ...
}
}
我认为问题源于此useful feature of the doc tests:
rustdoc will automatically add a
main()
wrapper around your code, and in the right place.
如果您应用 link 中的规则,您最终会编译如下代码:
fn main() {
extern crate bignum;
use bignum::inits::Zero;
let a = bignum::BigNum::new(Zero::zero());
}
然后您确实需要将其称为 self::bignum
,如第一条错误消息所示。不幸的是,由于 Rust issue 23314.