在文档测试中使用本地模块时出错

hey*_*yx3 4 testing documentation module rust

我正在玩一个用于生成2D噪音的小箱子.这是我的"lib.rs"文件的简化片段:

pub mod my_math {
    pub struct Vec2<T> {
        ...
    }
    ...
}
pub mod my_noise {
    use num::Float;
    use std::num::Wrapping;
    use my_math::*;

    /// Gets pseudo-random noise based on a seed vector.
    /// 
    /// # Examples
    /// 
    /// ```
    /// use my_math::Vec2;
    /// 
    /// let v_seed = Vec2::<f32>::new_values(4.134, -23.141);
    /// let noise_val = get_noise_white(&v_seed);
    /// 
    /// assert!(noise_val >= 0.0);
    /// assert!(noise_val <= 1.0);
    /// ```
    pub fn get_noise_white(seed: &Vec2<f32>) -> f32 {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行货物测试时,我收到以下错误:

---- my_noise :: get_noise_white_0 stdout ----

<anon>:3:9:3:16错误:未解决导入my_math::Vec2.也许是失踪extern crate my_math

<anon>:3使用my_math :: Vec2;

我还在use文档评论中尝试了其他形式的声明,包括use my_math::*;use self::my_math::*;.如果我完全删除该行,那么我得到一个Vec2未定义的错误.

这样做的正确方法是什么?

mdu*_*dup 5

你必须指定你的箱子的顶级名称(让我们称之为mylib):

use mylib::my_math::Vec2;
Run Code Online (Sandbox Code Playgroud)

理由是您的doc示例必须由库的客户端按原样使用.如果你把自己放在他们的鞋子里,他们会拿你的图书馆(通常用货物,但没关系),然后把extern crate mylib它们放在他们的顶级lib.rs/main.rs中.然后,为了使用库的某些部分,他们必须指定完全限定的名称才能使用其子代.

这正是你在rustdoc测试评论中必须做的事情.

此外,我认为值得引用Rust书的相关部分,即文档作为测试,它解释了应用于文档代码片段的一些小修改.其中之一是:

如果示例不包含extern crate,则extern crate <mycrate>;插入.