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. 拆解 Cursor Pro 自动化工具,看看它是怎么实现的?

    深入解析Cursor Pro自动化工具的核心实现 ‍ 从源码角度剖析关键技术 完整解读:注册.认证.机器码重置的自动化方案 项目概述 大家好,我是松哥.这篇文章将为大家详细解析一个Cursor自动化管 ...

  2. Alexander ——2024年报

    Alexander --2024年报 小总结 知己知彼,百战不殆.2024下半年找到了自己学习的方向,也认识很多的师傅,深入领域学习,无时不刻不在CTF的路上,逐渐建立一个完整的知识库体系. 今年的成 ...

  3. Kafka King 推荐一款漂亮、现代、实用的kafka客户端

    Kafka King 一个漂亮.现代.实用的kafka客户端,使用python flet.flutter构建. Github主页:https://github.com/Bronya0/Kafka-Ki ...

  4. openjdk8下载地址(附赠)

    openjdk下载地址:https://jdk.java.net/ (文末已经为大家下好了,放在网盘里) 进去后点8,win. 安装好后,使用java -version命令如下: 成功安装openjd ...

  5. 在Linux下使用wxWidgets进行跨平台GUI开发

    在Linux下使用wxWidgets进行跨平台GUI开发 wxWidgets是一个功能强大的跨平台C++ GUI框架,支持Windows.Linux和macOS等多种平台.本文将详细介绍在Linux系 ...

  6. WinForms中实现Adobe PDF Reader实现旋转PDF功能

    实现效果: 问题点:Adobe PDF Reader中并没有可以直接旋转的方法 LoadFile 加载文件,文件URL地址 GotoFirstPage 到第一页 GotoLastPage 到最后一页 ...

  7. shell 使用awk 分析nginx日志取出400 的请求写入文件,然后php读取文件处理数据

    使用awk分析昨日 的nginx日志,将服务端未处理成功的400 请求,重新请求,将数据补进去 下面是代码,如果有类似问题的话,可以参考一下 #!/bin/bash ## 1. shell 获取日期获 ...

  8. ChatClient vs ChatModel:开发者必须知道的4大区别!

    在 Spring AI/Spring AI Alibaba 框架中,ChatModel 和 ChatClient 都可以实现大模型的文本生成功能,例如聊天机器人,但二者是两种不同层级的 API 封装, ...

  9. 线程CompletableFuture简单使用 记录一下

    CompletableFuture.runAsync(() -> { //代码块 }); //可以选择线程执行后的结果去判断下一步的执行,具体使用百度自查

  10. mitmproxy 的使用

    from mitmproxy import http # 指定需要拦截的 URL 关键字(可以是完整 URL,也可以是匹配规则) TARGET_URL = "https://www.baid ...