错误E0433 - 从测试访问模块时使用未声明的类型或模块

时间:2016-10-10 13:54:08

标签: rust

作为Rust的第一个项目,我正在尝试创建一个行程编码库。

这是我的src/lib.rs(最初由货物创建):

#[cfg(test)]

mod rle;
mod tests {

    #[test]

    fn it_works() {
        let rle1 = rle::Rle {
            lengths: vec![1, 4, 2],
            values: vec![1, 2, 1],
        };
    }

}

这是我的src/rle.rs

pub struct Rle {
    lengths: Vec<i32>,
    values: Vec<i32>,
}

使用此布局,我得到error[E0433]: failed to resolve. Use of undeclared type or module 'rle'

我尝试遵循名为Crates and Modules的Rust文档中的指南。

我做错了什么?

如果布局不明显:

$ ls src
lib.rs rle.rs

2 个答案:

答案 0 :(得分:5)

使用#[cfg(test)]时出错。

Rust有两种应用属性的方法:

  • #[...]适用于下一个项目
  • #![...]适用于封闭项目

这意味着在这里,#[cfg(test)]正在应用于下一个项目(mod rle;),因此只能在测试模式下编译。另一方面,您的tests模块将始终被编译。

因此,当NOT在测试模式下运行时,您有:

  • 没有rle模块
  • tests模块引用rle模块

修复很简单:移动属性使其适用于mod tests,而不是mod rle

注意:

  • 如Chris所述,您还需要使用super::rle来引用rle模块。
  • 如ljedrz所​​述,您还需要声明Rle public的字段,以便能够从文件外部命名它们(如果测试位于同一文件中,则不应该出现问题)。 / LI>

答案 1 :(得分:4)

首先,您需要公开Rle个字段才能访问它们:

pub struct Rle {
    pub lengths: Vec<i32>,
    pub values: Vec<i32>,
}

然后,在lib.rs文件中你应该这样使用它:

mod rle; // you probably don't want #[cfg(test)] to apply to rle

#[cfg(test)] // this makes the tests module run only during cargo test
mod tests {
    use super::rle::Rle; // now Rle is applicable in the tests module

    #[test]
    fn it_works() {
        let rle1 = Rle {
            lengths: vec![1, 4, 2],
            values: vec![1, 2, 1],
        };
    }

}

请注意,我已将let rle1 = rle::Rle {更改为let rle1 = Rle {,因为我导入了super::rle::Rle而不只是super::rle

这可以毫无问题地编译。