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的更多相关文章

  1. Rust 中的继承与代码复用

    在学习Rust过程中突然想到怎么实现继承,特别是用于代码复用的继承,于是在网上查了查,发现不是那么简单的. C++的继承 首先看看c++中是如何做的. 例如要做一个场景结点的Node类和一个Sprit ...

  2. Rust 中的类型转换

    1. as 运算符 as 运算符有点像 C 中的强制类型转换,区别在于,它只能用于原始类型(i32 .i64 .f32 . f64 . u8 . u32 . char 等类型),并且它是安全的. 例 ...

  3. Rust中的RefCell和内部可变性

    RefCell Rust在编译阶段会进行严格的借用规则检查,规则如下: 在任意给定时间,要么只能有一个可变引用,要么只能有多个不可变引用. 引用必须总是有效. 即在编译阶段,当有一个不可变值时,不能可 ...

  4. Rust中的Slices

    这个slice切片,python中有,go中有, 但确实,Rust中最严格. 精彩见如下URL: Rust 程序设计语言(第二版) 简体中文版 · GitBook (Legacy) https://k ...

  5. 刷完欧拉计划中难度系数为5%的所有63道题,我学会了Rust中的哪些知识点?

    我为什么学Rust? 2019年6月18日,Facebook发布了数字货币Libra的技术白皮书,我也第一时间体验了一下它的智能合约编程语言MOVE,发现这个MOVE是用Rust编写的,看来想准确理解 ...

  6. 【译】Rust中的array、vector和slice

    原文链接:https://hashrust.com/blog/arrays-vectors-and-slices-in-rust/ 原文标题:Arrays, vectors and slices in ...

  7. 【译】理解Rust中的闭包

    原文标题:Understanding Closures in Rust 原文链接:https://medium.com/swlh/understanding-closures-in-rust-21f2 ...

  8. 【译】理解Rust中的局部移动

    原文标题:Understanding Partial Moves in Rust 原文链接:https://whileydave.com/2020/11/30/understanding-partia ...

  9. 【译】理解Rust中的Futures (一)

    原文标题:Understanding Futures In Rust -- Part 1 原文链接:https://www.viget.com/articles/understanding-futur ...

  10. 【译】理解Rust中的Futures(二)

    原文标题:Understanding Futures in Rust -- Part 2 原文链接:https://www.viget.com/articles/understanding-futur ...

随机推荐

  1. 记一次移动光猫(GM219-S)安全测试

    前言 过个年,WiFi密码忘记了-光猫管理密码也忘记了(这个光猫也不支持物理按钮重置设置),但是手机还连着WiFi,正规操作找回不了密码,那就用咱们测试的思维来试试PWN掉这个路由器. 过程 未授权获 ...

  2. UnoCSS原子CSS引擎

    UnoCSS是一款原子化的即时按需 CSS 引擎,其中没有核心实用程序,所有功能都是通过预设提供的.默认情况下UnoCSS应用通过预设来实现相关功能. UnoCSS中文文档: https://www. ...

  3. 信息资源管理文字题之“CIO基础职能”

    一.案例:某公司招聘CIO的岗位职责包括如下内容: (1)按照公司发展战略,负责组织制定公司信息化中长期发展规划和年度工作计划,并组织实施: (2)负责组织制定完善公司有关规章制度,并贯彻执行 (3) ...

  4. GDB调试Core文件出现问号?的原因

    函数的调用其实是函数的入栈出栈操作,但当程序栈因程序的错误导致破坏了栈,这时候就会导致gdb解析core文件时解析不出来的情况,即是问号(?) 那还能做点什么呢? 可以通过打印\(rbp\)和\(rs ...

  5. golang unsafe遇上字符串拼接优化导致的bug

    最近料理老项目的时候被unsafe坑惨了,这里挑一个最不易察觉的错误记录一下. 这个问题几乎影响近几年来所有的go版本,为了方便讨论我就用最新版的1.24.3做例子了. 线上BUG 我们有一个收集集群 ...

  6. Power BI回顾于2025年

    前段时间的工作主要是用Tableau和Tableau CRM,Power BI搁置了好一段时间.为了了解整个行业的趋势,偶尔也会回来看看Power BI这边的动静,毕竟自己当初就是从微软的技术路线开始 ...

  7. [原创]《C#高级GDI+实战:从零开发一个流程图》第01章:有什么用、有什么效果?

    一.有什么用? 问:现在这个年代哪些场景还需要GDI+? 答:很少,主要是在上位机,复杂一点的自定义控件几乎全由GDI+绘制而成.而且很多工业设备的电脑性能差,WPF等带不起来,只能是Winform. ...

  8. k8s pod command使用

    简单说明 我们启pod服务时,有时需要在服务启动前做一些初始化的工作,这里可能会涉及多个shell命令以及判断执行,这里可以参考下面的步骤进行: command: ["/bin/bash&q ...

  9. SAP扩展库位

    SAP扩充库位有两个方式:1,物料主数据里.2,MMSC. MMSC可以针对物料和工厂批量扩展.一般是业务常用的. FORM locat_dbc USING p_material p_plant p_ ...

  10. 温州大学X袋鼠云:高等人才教育建设,如何做到“心中有数”

    2022 年 4 月 16 日,神十三在东风着陆场预定区域成功着陆.接下来从 5 月开始,我国还将进行 6 次飞行任务,在今年内完成中国空间站的在轨建造.而以目前情况推测,在国际空间站退役后,中国空间 ...