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

Testing 在文档测试中使用本地模块时出错,testing,module,documentation,rust,Testing,Module,Documentation,Rust,我在玩一个小箱子,用来产生2D噪音。以下是我的“lib.rs”文件的简化片段: pub mod my_math{ 发布结构Vec2{ ... } ... } 酒吧改装噪音{ 使用num::Float; 使用std::num::Wrapping; 用我的数学::*; ///获取基于种子向量的伪随机噪波。 /// ///#示例 /// /// ``` ///使用我的数学::Vec2; /// ///设v_seed=Vec2:::新的_值(4.134,-23.141); ///let noise

我在玩一个小箱子,用来产生2D噪音。以下是我的“lib.rs”文件的简化片段:

pub mod my_math{
发布结构Vec2{
...
}
...
}
酒吧改装噪音{
使用num::Float;
使用std::num::Wrapping;
用我的数学::*;
///获取基于种子向量的伪随机噪波。
/// 
///#示例
/// 
/// ```
///使用我的数学::Vec2;
/// 
///设v_seed=Vec2:::新的_值(4.134,-23.141);
///let noise_val=获得白噪声(&v_seed);
/// 
///断言!(噪声值>=0.0);
///断言!(噪音值f32{
...
}
}
但是,当我运行货物测试时,我得到以下错误:

----我的杂音::获取杂音\u白色\u 0标准音----

:3:9:3:16错误:未解析的导入
my_math::Vec2
。可能是缺少
外部机箱my_math

:3使用我的数学::Vec2

我还在文档注释中尝试了其他形式的
use
语句,包括
use my_math::*;
use self::my_math::*;
。如果我完全删除该行,那么我会得到一个未定义的错误
Vec2


正确的方法是什么?

您必须指定板条箱的顶级名称(我们称之为mylib):

其基本原理是,您的文档示例必须与库的客户一样可用。如果您设身处地为他们着想,他们会取回您的库(通常是通过货物,但这并不重要)然后在它们的顶级lib.rs/main.rs中放置一个
extern板条箱mylib
。然后,为了使用部分库,它们必须指定完全限定名才能使用其子库

这正是你在评论中必须做的

此外,我认为值得引用Rust book的相关部分,其中解释了一些应用于doc代码片段的小修改。其中之一是:

如果示例不包含
外部板条箱
,则插入
外部板条箱;


谢谢,这就解决了!
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 {
        ...
    }
}
use mylib::my_math::Vec2;