56人参与 • 2026-08-27 • rust
本文以一个可运行的 demo 工程为例,循序渐进地演示 rust 的模块组织(lib.rs、独立文件模块、目录模块)与单元测试写法,文中代码均可直接复制运行。环境:windows + rust(edition 2024)。
cargo new demo
demo
|---- cargo.lock
|---- cargo.toml
|____ src
|____ main.rsfn main() {
println!("hello, world!");
}
$ cargo run
compiling demo v0.1.0 (path\to\demo)
finished `dev` profile [unoptimized + debuginfo] target(s) in 10.87s
running `target\debug\demo.exe`
hello, world!// 默认模块名为demo
// 定义一个简单的加法函数,声明为pub,供外部调用,否则不能为外部调用
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
//主函数,程序运行入口
fn main() {
let a = 88;
let b = 99;
let x = demo::add(a, b); //直接调用模块中的函数
println!("{a}+{b}={x}");
}
$ cargo run
compiling demo v0.1.0 (path\to\demo)
finished `dev` profile [unoptimized + debuginfo] target(s) in 0.78s
running `target\debug\demo.exe`
88+99=187
1、直接在源码中添加,例如直接在main.rs中添加如下:
//主函数,程序运行入口
fn main() {
let a = 88;
let b = 99;
let x = foo::add(a, b); //直接调用模块中的函数
println!("{a}+{b}={x}");
}
// 定义模块,名字为foo
mod foo {
//定义一个简单的加法函数,声明为pub,供外部调用,否则不能为外部调用
pub fn add(a:i32, b:i32) -> i32 {
a+b
}
}$ cargo run
compiling demo v0.1.0 (path\to\demo)
finished `dev` profile [unoptimized + debuginfo] target(s) in 1.41s
running `target\debug\demo.exe`
88+99=187
2、在新的源码foo.rs中自定义模块,在lib.rs中声明,在main.rs中调用
// 默认模块名为demo // 添加模块foo,指向foo.rs,调用时语法为demo::foo::add pub mod foo;
// 模块foo,是主模块demo的子模块,调用语法为demo::foo::add
// 定义一个简单的加法函数,声明为pub,供外部调用,否则不能为外部调用
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
//主函数,程序运行入口
fn main() {
let a = 88;
let b = 99;
let x = demo::foo::add(a, b); //直接调用模块中的函数
println!("{a}+{b}={x}");
}
// 模块foo,是主模块demo的子模块,调用语法为demo::foo::add
// 定义一个简单的加法函数,声明为pub,供外部调用,否则不能为外部调用
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
// 单元测试模块,不会编译到主程序中去!对应cargo test命令!
#[cfg(test)]
mod tests {
// 引用上面定义的所有函数
use super::*;
// 单元测试函数,测试时自动执行
#[test]
fn add_works() {
let result = add(90, 100);
assert_eq!(result, 190);
}
}$ cargo test
compiling demo v0.1.0 (path\to\demo)
finished `test` profile [unoptimized + debuginfo] target(s) in 0.55s
running unittests src\lib.rs (target\debug\deps\demo-<hash>.exe)
running 1 test
test foo::tests::add_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
running unittests src\main.rs (target\debug\deps\demo-<hash>.exe)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
doc-tests demo
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00smod foo { ... },再找源码名为foo.rs的文件(需要在lib.rs中声明pub mod foo;),第三找目录foo下的mod.rs文件。注意foo.rs与foo/mod.rs不能同时存在,否则编译器会报错!// 模块bar
// 定义简单的hi函数
pub fn hi(name:&str) {
println!("hi, {name}");
}
// 默认模块名为demo // 添加模块foo,指向foo.rs,调用时语法为demo::foo::add pub mod foo; // 添加模块bar,指向bar/mod.rs,调用时语法为demo::bar::hi pub mod bar;
//主函数,程序运行入口
fn main() {
demo::bar::hi("tomson");
}
$ cargo run
compiling demo v0.1.0 (path\to\demo)
finished `dev` profile [unoptimized + debuginfo] target(s) in 1.25s
running `target\debug\demo.exe`
hi, tomson
mod foo { ... }foo.rs + 在 lib.rs 中声明 pub mod foo;foo/mod.rs + 在 lib.rs 中声明 pub mod foo;foo.rs → foo/mod.rs;foo.rs 与 foo/mod.rs 不能同时存在!#[cfg(test)] + #[test],用 cargo test 运行,测试代码不编译进最终的可执行文件!demo::add → foo::add → demo::foo::add → demo::bar::hi到此这篇关于rust语言的模块源码组织和单元测试详解的文章就介绍到这了,更多相关rust模块源码组织和单元测试内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论