java项目中用maven管理代码时,如果遇到大型工程,一般会拆分成不同的模块,比如spring-mvc中,通常会按model, view, controller建3个模块,然后根据一定的依赖关系进行引用。这个概念在Rust中是通用的,只不过maven换成了cargo,而模块变成了crate,看下面的例子。
一、目录结构
.
├── Cargo.toml
├── controller
│ ├── Cargo.toml
│ └── src
│ └── main.rs
├── model
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── view
├── Cargo.toml
└── src
└── lib.rs
根目录下的Cargo.toml,类似maven中的父pom.xml,可以在其中声明子"模块":(注:为了避免与rust中的mod"模块"产生混淆,后面还是用crate来称呼“子模块”)
1
2
3
4
5
6
|
[workspace]
members=[
"model",
"view",
"controller"
]
|
这里声明了1个所谓的workspace,其中有3个成员,即3个目录对应的crate
二、子crata中的Cargo.toml声明
假设上面的工程结构中:
- model不依赖其它crate
- view依赖model
- controller依赖view及model
则这3个crate中的Cargo.toml文件,可以这样写:
model/Cargo.toml
1
2
3
4
5
6
7
|
[package]
name = "model"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
# 不依赖其它crate,此节点为空即可
|
view/Cargo.toml
1
2
3
4
5
6
7
8
|
[package]
name = "view"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
# 声明依赖model
model = {path = "../model"}
|
controll/Cargo.toml
1
2
3
4
5
6
7
8
|
[package]
name = "controller"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
model = {path = "../model"}
view = {path = "../view"}
|
三、代码引用
有了前面的各crate依赖声明,就可以来写代码了,参见下面的示例:
3.1 model/src/lib.rs
1
2
3
4
5
6
7
8
|
#[derive(Debug)]
pub struct User{
pub username:String,
pub password:String
}
#[derive(Debug)]
pub struct Order{
pub orderno:St
|
假设在model中定义了2个结构体(即:OOP中的class)
3.2 view/src/lib.rs
1
2
3
4
5
6
7
8
|
//使用model中的User类
use model::User;
pub fn get_login_info(name:String,pass:String)->User{
User{
username:name,
password:pass
}
}
|
3.3 controller/src/main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
use view::get_login_info;
use model::{User,Order};
fn main() {
let mut u = get_login_info(String::from("test"), String::from("123456"));
u.password = String::from("abcde");
println!("{:?}", u);
let o = Order{
orderno:String::from("20211244123")
};
println!("{:?}",o);
let u1 = User{
username:String::from("abcd"),
password:String::from("*123*J")
};
println!("{:?}",u1);
}
|
运行结果:
User { username: "test", password: "abcde" }
Order { orderno: "20211244123" }
User { username: "abcd", password: "*123*J" }
|