Rust中的workspace
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来称呼“子模块”)
[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
[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
[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
[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
#[derive(Debug)]
pub struct User{
pub username:String,
pub password:String
} #[derive(Debug)]
pub struct Order{
pub orderno:String
}
假设在model中定义了2个结构体(即:OOP中的class)
3.2 view/src/lib.rs
//使用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
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" }
Rust中的workspace的更多相关文章
- Rust 中的继承与代码复用
在学习Rust过程中突然想到怎么实现继承,特别是用于代码复用的继承,于是在网上查了查,发现不是那么简单的. C++的继承 首先看看c++中是如何做的. 例如要做一个场景结点的Node类和一个Sprit ...
- Rust 中的类型转换
1. as 运算符 as 运算符有点像 C 中的强制类型转换,区别在于,它只能用于原始类型(i32 .i64 .f32 . f64 . u8 . u32 . char 等类型),并且它是安全的. 例 ...
- Rust中的RefCell和内部可变性
RefCell Rust在编译阶段会进行严格的借用规则检查,规则如下: 在任意给定时间,要么只能有一个可变引用,要么只能有多个不可变引用. 引用必须总是有效. 即在编译阶段,当有一个不可变值时,不能可 ...
- Rust中的Slices
这个slice切片,python中有,go中有, 但确实,Rust中最严格. 精彩见如下URL: Rust 程序设计语言(第二版) 简体中文版 · GitBook (Legacy) https://k ...
- 刷完欧拉计划中难度系数为5%的所有63道题,我学会了Rust中的哪些知识点?
我为什么学Rust? 2019年6月18日,Facebook发布了数字货币Libra的技术白皮书,我也第一时间体验了一下它的智能合约编程语言MOVE,发现这个MOVE是用Rust编写的,看来想准确理解 ...
- 【译】Rust中的array、vector和slice
原文链接:https://hashrust.com/blog/arrays-vectors-and-slices-in-rust/ 原文标题:Arrays, vectors and slices in ...
- 【译】理解Rust中的闭包
原文标题:Understanding Closures in Rust 原文链接:https://medium.com/swlh/understanding-closures-in-rust-21f2 ...
- 【译】理解Rust中的局部移动
原文标题:Understanding Partial Moves in Rust 原文链接:https://whileydave.com/2020/11/30/understanding-partia ...
- 【译】理解Rust中的Futures (一)
原文标题:Understanding Futures In Rust -- Part 1 原文链接:https://www.viget.com/articles/understanding-futur ...
- 【译】理解Rust中的Futures(二)
原文标题:Understanding Futures in Rust -- Part 2 原文链接:https://www.viget.com/articles/understanding-futur ...
随机推荐
- 记一次移动光猫(GM219-S)安全测试
前言 过个年,WiFi密码忘记了-光猫管理密码也忘记了(这个光猫也不支持物理按钮重置设置),但是手机还连着WiFi,正规操作找回不了密码,那就用咱们测试的思维来试试PWN掉这个路由器. 过程 未授权获 ...
- UnoCSS原子CSS引擎
UnoCSS是一款原子化的即时按需 CSS 引擎,其中没有核心实用程序,所有功能都是通过预设提供的.默认情况下UnoCSS应用通过预设来实现相关功能. UnoCSS中文文档: https://www. ...
- 信息资源管理文字题之“CIO基础职能”
一.案例:某公司招聘CIO的岗位职责包括如下内容: (1)按照公司发展战略,负责组织制定公司信息化中长期发展规划和年度工作计划,并组织实施: (2)负责组织制定完善公司有关规章制度,并贯彻执行 (3) ...
- GDB调试Core文件出现问号?的原因
函数的调用其实是函数的入栈出栈操作,但当程序栈因程序的错误导致破坏了栈,这时候就会导致gdb解析core文件时解析不出来的情况,即是问号(?) 那还能做点什么呢? 可以通过打印\(rbp\)和\(rs ...
- golang unsafe遇上字符串拼接优化导致的bug
最近料理老项目的时候被unsafe坑惨了,这里挑一个最不易察觉的错误记录一下. 这个问题几乎影响近几年来所有的go版本,为了方便讨论我就用最新版的1.24.3做例子了. 线上BUG 我们有一个收集集群 ...
- Power BI回顾于2025年
前段时间的工作主要是用Tableau和Tableau CRM,Power BI搁置了好一段时间.为了了解整个行业的趋势,偶尔也会回来看看Power BI这边的动静,毕竟自己当初就是从微软的技术路线开始 ...
- [原创]《C#高级GDI+实战:从零开发一个流程图》第01章:有什么用、有什么效果?
一.有什么用? 问:现在这个年代哪些场景还需要GDI+? 答:很少,主要是在上位机,复杂一点的自定义控件几乎全由GDI+绘制而成.而且很多工业设备的电脑性能差,WPF等带不起来,只能是Winform. ...
- k8s pod command使用
简单说明 我们启pod服务时,有时需要在服务启动前做一些初始化的工作,这里可能会涉及多个shell命令以及判断执行,这里可以参考下面的步骤进行: command: ["/bin/bash&q ...
- SAP扩展库位
SAP扩充库位有两个方式:1,物料主数据里.2,MMSC. MMSC可以针对物料和工厂批量扩展.一般是业务常用的. FORM locat_dbc USING p_material p_plant p_ ...
- 温州大学X袋鼠云:高等人才教育建设,如何做到“心中有数”
2022 年 4 月 16 日,神十三在东风着陆场预定区域成功着陆.接下来从 5 月开始,我国还将进行 6 次飞行任务,在今年内完成中国空间站的在轨建造.而以目前情况推测,在国际空间站退役后,中国空间 ...