作为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
答案 0 :(得分:5)
使用#[cfg(test)]
时出错。
Rust有两种应用属性的方法:
#[...]
适用于下一个项目#![...]
适用于封闭项目这意味着在这里,#[cfg(test)]
正在应用于下一个项目(mod rle;
),因此只能在测试模式下编译。另一方面,您的tests
模块将始终被编译。
因此,当NOT在测试模式下运行时,您有:
rle
模块tests
模块引用rle
模块修复很简单:移动属性使其适用于mod tests
,而不是mod rle
。
注意:
super::rle
来引用rle
模块。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
。
这可以毫无问题地编译。