【Rust进阶】通过测试驱动开发学习:02_项目搭建

超硬货,大型 Rust 项目经验分享 本篇文章中,我将分享我组织大型 Rust 项目的经验。但这绝不是权威的,只是我通过尝试和错误中发现的一些小技巧。 Cargo,作为 Rust 的构建系统,遵循约定大于配置的原则。它不仅为小型项目提供了一套良好的默认配置集,尤其为公共 crates.io 库量身定做。虽然这些默认值并不完美,但它们已经足够用了。这对整个生态系统的一致性也是值得欢迎的。 然而当涉及到大型的、多 crate 的项目时,Cargo 就不那么统一了,它被组织成一个 Cargo 工作空间。而工作空间是灵活的 —— Cargo 对工作 阅读详情

第一个项目

创建一个对链表处理的库,包含链表新建,插入,获取元素,反转,排序等。具体功能在开发的时候详细说明。

链表

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据元素和指向下一个节点的引用。链表可以分为单向链表、双向链表和循环链表等不同类型。

单向链表中,每个节点包含一个数据元素和一个指向下一个节点的引用。最后一个节点的引用通常为空(null)。

双向链表中,每个节点除了包含数据元素和指向下一个节点的引用外,还包含指向前一个节点的引用。

循环链表是一种特殊的链表,其中最后一个节点指向第一个节点,形成一个循环。

请添加图片描述

链表的优点是插入和删除操作效率高,时间复杂度为O(1)。然而,链表的缺点是访问元素的效率较低,需要遍历整个链表,时间复杂度为O(n)。

头结点

  • 带头结点的链表是指在链表的头部增加一个空节点,这个节点不存储数据,仅用于简化链表操作。
  • 不带头结点的链表则直接从存储数据的第一个节点开始。

带头结点的链表在实现上更加简单,因为不需要特殊处理头节点为空的情况,而不带头结点的链表则需要额外处理头节点为空的情况。带头结点的链表可以简化插入和删除操作的代码逻辑,但会浪费一个节点的存储空间。

接下来没有特殊说明我们的链表都默认带头结点,而头结点的值设为其包含的元素个数。

创建一个库项目

cargo new --lib 库名

定义链表

#[derive(Debug)]
pub struct LinkedNode<T> {
	data: T,
	next: Option<Box<LinkedNode<T>>>,
}


#[derive(Debug)]
pub struct LinkedList<T> {
	head: Option<Box<LinkedNode<T>>>,
}
  1. 定义节点的结构体LinkedNode,它包含一个data字段,存储当前节点的数据,next字段是一个枚举类型,包含了指向下一个节点的指针。
  2. 定义了链表的结构体LinkedList,它包含一个字段head,是一个枚举类型,包含了一个指向第一个节点的指针。

从上面的代码中,其实我们发现LinkedNode结构体就已经使用和表示链表结构,为什么还要创建一个新的结构体Linked_list来将Node封装进去呢?

LinkedNode<T> 结构体表示链表的节点,而 LinkedList<T> 结构体则表示整个链表的结构。为什么要分开这两个结构体呢?这主要涉及到设计和使用的灵活性、代码组织以及一些操作的方便性。

  1. 抽象层次: Node<T> 结构体是链表节点的具体实现,而 LinkedList<T> 结构体是对整个链表的抽象。通过引入 LinkedList 这一层次,你可以对外提供更高级别的操作,例如插入、删除、反转等,而不需要直接操作节点的内部结构。

  2. 封装和隐藏细节: 使用 LinkedList 可以隐藏底层实现细节,用户不需要关心节点的具体结构,而只需调用 LinkedList 提供的方法进行操作。这有助于维护代码的一致性和易用性。

  3. 操作方便性: LinkedList 可以提供一些便捷的操作方法,如在链表头部插入元素、尾部插入元素等。这些方法可以通过模式匹配和对 Node 结构体的内部进行调用来实现,但如果直接在 Node 上操作,可能会使代码显得更加冗长。

  4. 可扩展性: 如果未来你决定改变链表的底层实现,例如使用双向链表或其他数据结构,只需修改 LinkedList 的内部实现而无需改变使用链表的代码。这种解耦可以提高代码的可维护性和可扩展性。

  5. 一致性和规范性: 使用 LinkedList 作为接口可以让代码库中的多个模块或者多个人员保持一致的链表使用方式,而不会因为 Node 结构体的变化而产生影响。

在实践中,这种分层设计的方式通常有助于提高代码的清晰度、可维护性和可拓展性。

新建表

  
impl<T> LinkedNode<T> {

	pub fn new(value: T) -> Self {

		LinkedNode {

			data: value,

			next: None,

		}

	}

}

  

impl<T> LinkedList<T> {

	pub fn new(value: T) -> Self {

		LinkedList {

			head: Some(Box::new(LinkedNode::new(value))),

		}

	}
}

编写测试

先使用属性宏#[cfg(test)]来标记一个测试模块,该属性指示编译器仅在测试的时候被编译。同时使用#[test]来标记一个测试函数。

// Unit tests
#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_linked_node() {
        let node = LinkedNode::new(1);
        assert_eq!(node.data, 1);
    }

    #[test]
    fn test_linked_list() {
        let list = LinkedList::new(1);
        assert_eq!(list.head.as_ref().unwrap().data, 1);
    }
}

运行测试

运行 cargo test 命令时,会触发 Rust 项目中的测试套件,并执行所有标记为测试函数的代码块。

请添加图片描述

测试通过 ✅

版本管理

我们的项目第一步初步搭建已经完成了,为了方便对项目进行管理,我们使用Git。

如果没有接触过Git可以自行搜索其相关的用法,并不复杂,后续我们的项目都是基于Git进行版本管理的。

rust使用cargo创建一个项目的时候,如果你上级目录没有git仓库,或者你没有特殊禁用生成git仓库,它会自动给你初始化一个git仓库

# 项目根目录下初始化一个git仓库
git init 

# 将已经修改的项目添加到暂存区
git add .

# 将暂存区的内容提交到本地仓库
git commit -m "相关内容的描述"
# 

现在我们将一个初始项目搭建起来了,后续我们的开发流程在确定要实现某一个功能后就在如下几个环节之间循环开发:

编写测试 -> 运行测试 -> 修复错误 -> 测试通过 -> 版本管理

下一章我们将对链表的数据进行增删改查。

储能电站 BMS 与车载动力电池 BMS 核心差异:工况、保护策略、控制逻辑对比 储能电站BMS与车载动力电池BMS虽同名,实为针对不同赛道量身定制的产品。简单地将车载BMS方案套用于储能,或将储能BMS思路用于车载,都可能带来性能、安全或成本上的严重问题。在选择和设计BMS时,必须回归其应用场景的本质需求储能BMS是**“资产管理者”**,精打细算,追求在长达十余年的服役期内稳定、高效地创造收益。车载BMS是**“性能与安全卫士”**,反应敏捷,确保在车辆全生命周期内动力澎湃且万无一失。 阅读详情

相关推荐

2024“华为杯”中国研究生数学建模竞赛(A题)深度剖析_数学建模完整过程+详细思路+代码全解析

目标是优化风力涡轮机的功率调度,使其在给定的实时风速数据下,最小化涡轮机关键组件(如塔架和主轴)的疲劳损伤。问题的挑战在于,考虑通信延迟和测量噪声的同时,要确保功率输出与风速变化的响应快速且准确。

2401_82549447的博客 6627

11. Linux驱动 - Rust编写Linux驱动

Linux 中设备通常被分为三类,每个驱动模块通常实现为这三类中的其中一种: 字符设备。通常是指可以当作一个字节流来存取的设备(比如文件)。 块设备。通常是可以驻有文件系统的设备(比如磁盘),和字符设备类似,但块设备有一个请求缓冲区,因此它们可以选择响应请求的最佳顺序。 网络设备。通常是指能与其他主机交换数据的设备。 我们以编写一个简单的字符设备驱动为例,展示如何用 Rust 来编写内核驱动。 R4L 开发环境准备 为了方便,我们把 Rust for Linux 简称为 R4L。 首先,下载 Rust

笨笨D幸福 - 后花园 4549

LTspice仿真三线制PT100高精度测温系统设计

本文详细介绍了如何使用LTspice仿真设计三线制PT100高精度测温系统。文章从三线制原理出发,逐步讲解了在LTspice中建模PT100、构建惠斯通电桥进行信号转换、设计差分放大与滤波电路、选型ADC以及进行系统联调与误差分析的全过程,旨在帮助工程师实现0.5°C分辨率的工业测温方案设计。

pz89012345的博客 98

Rust实战系列-Rust介绍

Rust实战系列第一部分,主要包括Rust的基本介绍。

分享观点和经验,欢迎交流。 1615

机器学习 -- 信用卡评分模型 -- 互联网金融风控

互联网金融主要分为资金类和资产类。资金类主要是理财产品,吸储,主要指标是用户转化、留存和复投,重在客户运营。资产类主要是贷款,包括消费金融和现金贷,小额贷款属于此类,主要目的是用户转化,还款和风险控制,信用卡评分模型就属于风险控制。 信用评分作用是对贷款申请人(信用卡申请人)做风险评估分值的方法。 信用卡评分是以大量数据的统计结果为基础,根据客户提供的资料和历史数据对客户的信用进行评估,评分卡模型...

XiaoMaEr66的博客 2418

【React Native】源码分析之Native UI的封装和管理

转载请注明出处:http://blog.youkuaiyun.com/u013531824/article/details/54020287,谢谢。  ReactNative作为使用React开发Native应用的新框架,随着时间的增加,无论是社区还是个人对她的兴趣与日递增。此文目的是希望和大家一起欣赏一下ReactNative的部分源码。阅读源码好处多多,让攻城狮更溜的开发ReactNative应用的同时,也

Tiny的专栏 9777

【Rust进阶】通过测试驱动开发学习:01_介绍

在这个系列的开篇,我们将探索如何通过测试驱动开发(TDD)来学习Rust编程语言。TDD是一种软件开发方法,它鼓励先编写单元测试,然后编写满足测试的代码,最后重构代码以优化设计。本节介绍了TDD的基本概念,以及如何在Rust中实现它。我们将从创建一个注定失败的测试开始,然后编写通过该测试的代码,并逐步构建出功能完整的Rust应用程序。这种方法不仅能帮助我们更深入地理解Rust的特性,还能确保我们的代码质量和可维护性。随着我们的进展,我们将不断回顾和应用Rust的高级特性,使我们的代码更加健壮和高效。

编程不止 1180

趋势跟踪策略

/ 绘制K线图的下跌部分,使用绿色标记 stickline(close>=open,high,close,1,1,colorgreen);end // 在图表上绘制当前趋势的图标,如果trend=1或-1 drawicon(trend=1,stopprice,10);end // 绘制K线图的上涨部分,使用红色标记 stickline(close>=open,high,close,1,1,colorred);

2401_84919512的博客 353

学习Rust适合写什么练手项目?【云驻共创】

Rust是一门备受关注的系统级编程语言,因其出色的内存安全性、高性能和并发性能而备受赞誉。对于那些希望学习和掌握Rust编程语言的人来说,练手项目是一个不可或缺的环节。通过实际动手完成项目,你可以加深对Rust语言特性和最佳实践的理解,提升自己的编程能力。在本文中,我们将推荐一些适合练手的项目,这些项目既能充分利用Rust的特点,又适合不同难度层次的学习者。它的静态类型、内存安全、并发性等特点使其在系统编程、嵌入式系统、网络编程等领域有着广泛的应用。

一键难忘的博客 2765

C# 与欧姆龙 PLC 实战:通过 Ethernet/IP 协议进行设备控制与监控

本文介绍了如何通过C#和Ethernet/IP协议实现与欧姆龙PLC的通信。Ethernet/IP是基于以太网的工业协议,适用于工业设备间的实时数据交换。文章详细讲解了使用EthernetIPSharp库建立连接、读写数据的步骤,并提供了示例代码。此外,还探讨了实时监控、报警系统等高级功能,为工业自动化控制系统开发提供了实用指导。该方法简化了PLC通信开发,提高了系统可靠性和智能化程度。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 811

【NLP】第十章:位置编码Positional Encoding

前面讲RNN时一般都会有一个ht的输出,这个输出就是样本与样本之间的信息,而且RNN是时序循环的,所以RNN本身的结构,在物理上,就自带词的前后顺序信息的。比如词never,不管never本身的词向量是什么,只要你在序列中排第一个位置,你的位置向量就是[0,1,01],你排第三个位置,你的位置向量就是[0.9,-0,4,0.2,1.0]。也所以,你可以理解为:embedding后的词嵌入,PE按照每个样本在sequence中的位置,把embedding后的词嵌入给扭转后,才送入attention的。

因为热爱所以坚持 1917

【一起学Rust · 项目实战】命令行IO项目minigrep——测试驱动开发完善功能

经过前面三节的学习,我们的小工具minigrep已经实现了读取指定文件内容,并且为了后期开发和测试的方便,重构了整个项目,使错误处理规整化,模块规范化。本次我们将采用测试驱动开发(以后简称TDD)的模式进行开发,为程序编写几个程序测试用例,测试程序搜索查询字符串并返回匹配的行示例的功能,这些功能会在后面开发过程中用到。测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。.........

专注Rust编程与技术分享,涵盖C++、Python等开发实战,新手友好,专注实战,助力编程成长。 8万+

DICOM图像知识:深入详解DICOM的层级关系

解析DICOM的四个主要层级:Patient(患者)、Study(检查)、Series(序列)和SOP(服务-对象对),探讨它们之间的关系、各自的唯一标识符以及在实际应用中的用途

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 3304

终极Rust学习工具指南:如何高效完成100个Rust练习

想要学习Rust但不知道从何开始?100-exercises-to-learn-rust项目为你提供了一个完美的起点。这个循序渐进的自学课程通过100个精心设计的练习,帮助开发者从零基础掌握Rust编程。然而,选择合适的开发工具能让你事半功倍,本文将为你推荐最佳的Rust开发环境配置,让你在完成这些练习时更加高效顺畅。 ## 为什么需要专业的Rust开发工具? Rust作为一门系统级编程语言,

gitblog_00441的博客 923

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Windows Rust 驱动开发示例项目常见问题解决方案

Windows Rust 驱动开发示例项目常见问题解决方案 1. 项目基础介绍和主要编程语言 该项目是微软提供的用于展示如何使用 Rust 语言编写 Windows 驱动程序的样例集合。Rust 是一种注重系统编程的安全性和并发性的现代编程语言,非常适合用来开发性能要求高且对稳定性有严格要求的驱动程序。 主要编程语言 Rust: 项目中所有驱动样例均使用 Rust 语言编写,这是该项目的核心编程...

gitblog_00039的博客 894

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Rust 工程实践:从模块化到测试驱动开发

Rust 的成功不仅来自语言层面,更来自它的工程文化模块化让系统结构可维护;测试驱动保证可靠性;工具链提升开发效率;持续集成确保稳定交付。这种体系化的设计让 Rust 不仅适合写底层库或嵌入式程序,也能支撑大型分布式系统、Web 服务与企业级平台。掌握这些工程化实践,你就不只是“会写 Rust”,而是能用 Rust 构建可持续演进的软件系统。

m0_74256065的博客 808

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Rust自学】12.6. 使用TDD(测试驱动开发)开发库功能

第12章要做一个实例的项目——一个命令行程序。这个程序是一个`grep`(Global Regular Expression Print),是一个全局正则搜索和输出的工具。本文负责完善搜索函数,使用TDD(测试驱动开发)理念来开发功能。这篇文章有助于你学习实战中开发功能的步骤。

A Rookie in San Domenico School 1403

【亲测免费】 使用Rust打造Windows驱动程序:Rust Driver Samples完全指南

使用Rust打造Windows驱动程序:Rust Driver Samples完全指南 安装指南 必要条件 建立EWDK开发环境: 访问微软官方指南安装最新版企业级Windows驱动开发套件(EWDK),或直接下载ISO映像文件至C盘根目录下的 ewdk 文件夹,并通过命令行启动:c:\ewdk\LaunchBuildEnv.cmd。 使用Windows Package Manager (w...

gitblog_01297的博客 1609

Rust语言刷LeetCode的终极指南:leetcode-rust项目实战教程

在算法学习与面试准备的道路上,选择合适的编程语言和高效的练习方式至关重要。**Rust语言**凭借其内存安全、高性能和现代语法特性,正成为越来越多开发者刷LeetCode的首选。而**leetcode-rust**项目则为Rust爱好者提供了一个系统化的解题方案,本文将带你快速掌握如何利用该项目提升算法能力,轻松应对各类编程挑战。 ## 🚀 项目快速上手:3步即可开始刷题之旅 ### 1️⃣

gitblog_00220的博客 816

leetcode-rust中的测试驱动开发:如何编写健壮的算法测试

在算法开发领域,测试驱动开发(TDD)是确保代码质量和正确性的关键实践。**leetcode-rust**项目通过Rust语言实现了LeetCode算法题解,并采用了系统化的测试策略。本文将深入探讨如何在该项目中应用TDD思想,构建可靠的测试用例,以及如何利用Rust的测试框架确保算法的健壮性。 ## 🧪 测试驱动开发在算法解题中的价值 测试驱动开发的核心思想是"先测试后编码",这在算法实现

gitblog_00751的博客 349

Rust中的测试驱动开发:如何用TDD打造高可靠性系统代码

掌握Rust测试框架,实践测试驱动开发,提升系统代码可靠性。本文详解TDD在Rust中的落地方法,涵盖单元测试、集成测试与断言技巧,适用于高并发与嵌入式场景,保障代码质量,值得收藏。

BreakNexus的博客 950

探索Rust与领域驱动设计的完美融合:Rust DDD示例项目

探索Rust与领域驱动设计的完美融合:Rust DDD示例项目 在技术的浩瀚星辰中,有一种力量悄然改变着软件开发的格局——那就是【Rust】语言结合领域驱动设计(DDD)的思想。今天,我们有幸向您推荐一个精心打造的开源项目:Rust Domain Driven Design Example。这个项目不仅展示了Rust的强大之处,更是将复杂的业务逻辑以DDD模式优雅呈现,为您的软件开发之旅带来新灵感...

gitblog_01133的博客 1240

Windows Rust 驱动程序示例项目安装和配置指南

Windows Rust 驱动程序示例项目安装和配置指南 1. 项目基础介绍和主要编程语言 项目基础介绍 Windows Rust 驱动程序示例项目是由微软开发的一个开源项目,旨在为开发者提供使用 Rust 语言编写 Windows 驱动程序的示例和最佳实践。该项目是官方 Windows 驱动程序示例的 Rust 移植版本,利用了 windows-drivers-rs 库。 主要编程语言 该项目主...

gitblog_01220的博客 1180

测试驱动开发(TDD)在 Rust 中的实践

测试驱动开发(TDD)在 Rust 中的实践

m0_62599305的博客 964

探索未来驱动开发:Rust在Windows平台的新篇章

探索未来驱动开发:Rust在Windows平台的新篇章 随着技术的演进,驱动程序开发这一核心领域迎来了新的变革。我们荣幸地向大家推介一个革命性的开源项目——Rust Driver Samples。这个项目不仅标志着Rust编程语言在Windows驱动开发中的突破性应用,同时也为开发者们提供了宝贵的实践经验和最佳实践策略。 项目介绍 Rust Driver Samples 是原生Windows驱动样...

gitblog_00296的博客 876

如何编写嵌入式Rust驱动程序:std-training I2C驱动开发实战

想要学习嵌入式Rust开发吗?std-training项目为你提供了一个完整的I2C驱动开发实战教程!在这个嵌入式Rust培训项目中,你将掌握如何为Espressif ESP32-C3编写专业的I2C驱动程序。通过这个实战指南,即使是Rust新手也能快速上手嵌入式系统开发,理解I2C总线通信的核心原理,并学会如何编写可靠的硬件驱动程序。 ## 🚀 I2C总线通信基础 I2C(Inter-In

gitblog_00957的博客 1031
上一篇: 【Rust进阶】通过测试驱动开发学习:01_介绍
下一篇: 【Rust进阶】通过测试驱动开发学习:03_单链表的插入
SunsJay
博客等级 码龄6年 95粉丝 7原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值