11

我很难在我的库的文档示例中修复错误。我有像我的箱子一样的文件结构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());

但是它编译得很好。如何正确导入我的模块?

4

2 回答 2

14

我认为问题源于文档测试的这个有用功能

rustdoc 将自动main()在您的代码周围添加一个包装器,并在正确的位置。

如果您在链接中应用规则,您最终会编译如下代码:

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

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

self::bignum正如第一条错误消息所暗示的那样,您确实需要将其称为。不幸的是,由于Rust 问题 23314 ,这目前不起作用。

于 2015-07-26T16:02:54.190 回答
4

因此,生成此错误的原因归结extern crate bignum为文档示例隐式使用,这意味着我不需要明确告诉我将使用的示例bignum

这是有道理的,因为在文档级别,示例显示了您的 crate 特定部分的功能应该如何工作,因此您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 {
        // ...
    }
}
于 2015-07-26T15:27:51.523 回答