学习Rust适合写什么练手项目?【云驻共创】
Rust是一门备受关注的系统级编程语言,因其出色的内存安全性、高性能和并发性能而备受赞誉。对于那些希望学习和掌握Rust编程语言的人来说,练手项目是一个不可或缺的环节。通过实际动手完成项目,你可以加深对Rust语言特性和最佳实践的理解,提升自己的编程能力。在本文中,我们将推荐一些适合练手的项目,这些项目既能充分利用Rust的特点,又适合不同难度层次的学习者。
它的静态类型、内存安全、并发性等特点使其在系统编程、嵌入式系统、网络编程等领域有着广泛的应用。对于初学者来说,选择一些合适的练手项目可以帮助他们更好地掌握Rust语言的特点和技巧。以下是一些适合Rust练手的项目,难度从易到难,可以让初学者逐步提高技能。
一、简单级别的练手项目:
我用Rust写了一个练手项目是一个股票查询应用,代码大约500行,效果如下:

可以通过输入证券代码创建新的条目

最后,这个项目输出的exe只有600k,在windows版本下运行无任何依赖,可惜的是Windows 8等早期版本的中文Terminal有bug,会导致窗口对不齐,windows10以后没问题了。
- 命令行工具:使用Rust编写一个简单的命令行工具,例如文件管理工具、数据转换工具或文本处理工具。Rust的模式匹配和错误处理机制使得处理命令行参数和输入输出变得非常简洁。
- 互联网爬虫:编写一个简单的网络爬虫,从指定网站上获取数据并进行处理。Rust的并发性能和轻量级的线程模型使其非常适合处理网络请求和并行任务。
- 迷宫生成器:使用Rust生成一个随机迷宫,并实现寻路算法解决迷宫问题。Rust的所有权和借用系统可以帮助你管理迷宫的数据结构,同时有效地避免内存安全问题。
二、中级级别的练手项目:
前几天刚好用python结合fastapi做了一个简单的web应用:倒计时
效果展示:

依次输入倒计时的:年、月、日、时,就可以自动计算当前的时间距离倒计时日的时间间隔。
生成基础的显示单元
使用python的matplotlib,把我们需要显示的基础字符转换成图像。我们这里需要显示这几个内容:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, day, hou, min, sec。
全都放在一个文件夹下:

这个功能和实现在save2number.py模块里面。
如果我们为了在终端里面显示4这个数字,我们需要读取这个数字的图像,并且对图像的每一个像素值转换成字符串。然后都保存到向量里面。
为了可以并排显示多个数字,再对单个数字的字符串向量做拼接。就可以并排形成多个数字了。 比如说我要显示:5169。那么显示出来的效果就是这样的:
既然我们都可以显示数字,其实显示这些简单的字符也是可以的。比如这样的效果

感受:
- 写rust的时候,整体感觉和写python差不多。写起来感觉比写C、C++轻松不少。
- rust的变量的生命周期我还没完全搞清楚,尤其是在循环里面,生命周期奇奇怪怪的。(还是不熟悉,还在探索)。
- 一共两天时间写出来的。还是比较顺利的,接下来把中间遇到的小问题再好好研究研究。
- 感觉其实还是向量处理、字符串处理,思想其实和R、python也都差不多。大部分代码都是在和向量、字符串打交道。
- 仿真游戏:使用Rust编写一个简单的仿真游戏,例如生命游戏(Conway's Game of Life)或粒子系统。Rust的高性能和低级别的内存控制使得实时渲染和物理模拟成为可能。
- 简单的Web服务器:使用Rust编写一个简单的HTTP服务器,实现基本的请求处理和静态文件服务。Rust的异步编程能力和轻量级的线程模型使其非常适合构建高性能的Web服务器。
- 数据库连接器:编写一个简单的数据库连接器,与某个流行的数据库系统进行交互(如SQLite或MySQL)。Rust的安全性和线程安全性能帮助你处理数据库的连接管理和查询执行。
三、高级级别的练手项目:
编写一个Tcp server端与一个Tcp client端,客户端中输入内容后,服务端可以返回相应的输入内容
服务端的实现:
//
//@author Bayek
//@dev server用于监听
//
use std::net::{TcpListener, TcpStream};
use std::thread;
//std::thread库的引入,对输入的每一个流创建一个线程
use std::time;
use std::io::{self, Read, Write};
//引入io库,为了处理错误fn handle_client(mut stream: TcpStream) -> io::Result<()> {//该函数用来处理client(就是这个流),流的格式或者说他的类型就是TcpStreamlet mut buf = [0; 512];//创建一个叫buf的数组,内容为0,长度为512loop {//该循环表示server端永久提供服务,因为默认服务器为永不关闭的let bytes_read = stream.read(&mut buf)?;//从流里面读内容,读到buf中if bytes_read == 0 {return Ok(());//如果读到的为空(即0),则说明已经结束了}stream.write(&buf[..bytes_read])?;//否则把它写回去thread::sleep(time::Duration::from_secs(1));//调用sleep函数实现服务的间隔,间隔1s}
}fn main() -> io::Result<()> {let listener = TcpListener::bind("127.0.0.1:8080")?;//定义一个listener,bind函数里面填写的是监听的的ip与端口号,?是一种简写,等价于except,unwraplet mut thread_vec: Vec<thread::JoinHandle<()>> = Vec::new();//创建一个容器,用来放线程的句柄for stream in listener.incoming() {let stream = stream.expect("failed");//转换一下stream流,出现问题,提示“失败”,没有问题,继续下面的操作let handle = thread::spawn(move || {handle_client(stream).unwrap_or_else(|error| eprintln!("{:?}", error));});//对输入的每一个流来创建一个线程,利用必包进行一个处理thread_vec.push(handle);//把handle加到容器里面}for handle in thread_vec {//此循环为了等待线程的结束handle.join().unwrap();//等待结束的具体实现}Ok(())
}
客户端的实现:
//
//@author Bayek
//@dev server端进行监听,在client端发起链接
//
use std::io::{self, prelude::*, BufReader, Write};
use std::net::TcpStream;
use std::str;fn main() -> io::Result<()> {let mut stream = TcpStream::connect("127.0.0.1:8080")?;//创建变量stream,直接连接sever端for _ in 0..10 {let mut input = String::new();//定义一个String类型的输入io::stdin().read_line(&mut input).expect("Failed to read!");//从标准输入读入一行,读入input里面,如果有问题的话,提示“读取失败”stream.write(input.as_bytes()).expect("Failed to write!");//把input读取的内容,转换成bytes后,写到stream流里面去,如果写入失败,提示“写入失败”let mut reader = BufReader::new(&stream);//从stream流创建一个读,目的是要从我们的server端读,let mut buffer: Vec<u8> = Vec::new();//用Vector创建一个buffer变量 reader.read_until(b'\n', &mut buffer).expect("Failed to read into buffer");//一直读到换行为止(b'\n'中的b表示字节),读到buffer里面println!("read from server: {}", str::from_utf8(&buffer).unwrap());//把读取到buffer中的内容打印出来println!("");//再来一个换行,美化输出}Ok(())
}
运行结果:
server端运行 cargo run 编译运行程序:

client端同样运行 cargo run 编译运行程序,可以看到来自服务端返回的消息,服务端读取了来自客户端输入的内容,并返回了读取内容


- 编程语言解释器:使用Rust构建一个简单的编程语言解释器,包括词法分析、语法分析和执行引擎。Rust的模式匹配和错误处理机制使其非常适合处理语法解析和代码执行。
- 操作系统内核:尝试编写一个简单的操作系统内核,包括进程管理、内存管理和设备驱动。Rust的内存安全性和并发性能使其成为构建高可靠性操作系统的理想选择。
- 区块链实现:使用Rust构建一个简单的区块链实现,包括区块链数据结构、交易验证和共识算法。Rust的并发性能和低级别的内存控制使其非常适合构建高性能和安全的区块链系统。
- 图形界面应用:使用Rust和图形界面库(如GTK、Qt或Dear ImGui)编写一个跨平台的图形界面应用程序。你可以选择开发一个文本编辑器、绘图工具或音乐播放器等,利用Rust的并发性能和内存安全性创建出高效、可靠的应用程序。
- 机器学习库:使用Rust编写一个简单的机器学习库,实现基本的机器学习算法(如线性回归、决策树或神经网络)。Rust的性能和并发性能使其成为构建高性能机器学习库的理想选择。
- 分布式系统:尝试构建一个简单的分布式系统,涉及多个节点之间的通信和协调。你可以使用Rust的网络编程库(如Tokio)和分布式协议(如Raft)来实现强大的分布式系统。
- 编译器:挑战自己,使用Rust构建一个简单的编译器,包括词法分析、语法分析、中间代码生成和代码优化。这个项目将帮助你深入理解编程语言和编译原理,并提升你的系统级编程技能。
- 高性能网络服务器:使用Rust编写一个高性能的网络服务器,处理大量并发连接和高负载请求。你可以尝试使用Rust的异步编程框架(如Actix)和网络库(如Tokio)来构建一个高效、可扩展的服务器。
- 图像处理库:使用Rust构建一个图像处理库,包括图像解码、图像转换和基本的图像操作。Rust的性能和内存安全性将使你能够处理大规模的图像数据,并实现高效的图像处理算法。
四、结论:
以上是一些适合Rust练手的项目,难度从易到难,可以让初学者逐步提高技能。通过这些项目的实践,初学者可以更好地掌握Rust语言的特点和技巧,深入了解系统编程、网络编程等方面的知识。同时,这些项目也能够帮助他们锻炼面向对象编程和泛型的使用方法,提高编程能力,为未来更复杂的应用程序的实现打下坚实的基础。
相关文章:
学习Rust适合写什么练手项目?【云驻共创】
Rust是一门备受关注的系统级编程语言,因其出色的内存安全性、高性能和并发性能而备受赞誉。对于那些希望学习和掌握Rust编程语言的人来说,练手项目是一个不可或缺的环节。通过实际动手完成项目,你可以加深对Rust语言特性和最佳实践的理解&…...
Spring Cloud学习(九)【Elasticsearch 分布式搜索引擎01】
文章目录 初识 elasticsearch了解 ES倒排索引ES 的一些概念安装es、kibana安装elasticsearch部署kibana 分词器安装IK分词器ik分词器-拓展词库 索引库操作mapping 映射属性索引库的 CRUD 文档操作添加文档查看、删除文档修改文档Dynamic Mapping RestClient 操作索引库什么是Re…...
jvm 内存结构 ^_^
1. 程序计数器 2. 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 程序计数器 定义: Program Counter Register 程序计数器(寄存器) 作用,是记住下一条jvm指令的执行地址 特点: 是线程私有的 不会存在内存溢出 虚拟机栈…...
SQL基础理论篇(八):视图
文章目录 简介创建视图修改视图删除视图总结参考文献 简介 视图,即VIEW,是SQL中的一个重要概念,它其实是一种虚拟表(非实体数据表,本身不存储数据)。 视图类似于编程中的函数,也可以理解成是一个访问数据的接口。 从…...
element-ui中怎样使用iconfont的图标
1 登录 https://www.iconfont.cn/ 2 搜索合适的图 这里可以找到这个图所在的图库。这样就可以一次查找到对应的所有同款图标 3 选择同款加入购物车 4 将购物车的icon加入项目,注意是新建项目,除非你是确定需要前面已经加过的icon 5 下载icon 选择fon…...
记一次struct2漏洞获取服务器
文章目录 一、漏洞原因二、漏洞成果三、漏洞利用0x01 struts2漏洞获取shell0x02 todesk配置文件获取连接0x03 orcal数据库连接0x04 web网站 sso管理权限0x05 tomcat网站0x06 获取路由器权限0x07 远程桌面四、总结五、免责声明一、漏洞原因 由于网站使用struct2框架,未及时进行…...
ChatGPT API 学习
参考:从零开始的 ChatGPT API 使用指南,只需三步! - 知乎 (zhihu.com) ChatGPT API 是一种由 OpenAI 提供的 API,它可以用最简单的方式把 ChatGPT 的聊天能力接入到各种应用程序或服务中。 自然语言语音识别(Natural Language S…...
nginx中将指定文件夹设置为虚拟目录
记得目录后面要加个斜杠“/"。 话说,我们系统有照相机和摄像头,可以产生照片和视频。通过nginx将照片和视频所在文件夹映射为虚拟目录,外部即可访问。 如何映射(或曰,转发)呢?这样写&…...
78基于matlab的BiLSTM分类算法,输出迭代曲线,测试集和训练集分类结果和混淆矩阵
基于matlab的BiLSTM分类算法,输出迭代曲线,测试集和训练集分类结果和混淆矩阵,程序有详细注释,数据可更换自己的,程序已调通,可直接运行。...
苹果MAC安装绿盾出现问题,安装时没有出现填服务器地址的页面,现在更改不了也卸载不了绿盾 怎么处理?
环境: Mac mini M1 Mac os 11.0 绿盾v6.5 问题描述: 苹果MAC安装绿盾出现问题,安装时没有出现填服务器地址的页面,现在更改不了也卸载不了绿盾 怎么处理? 解决方案: 大部分企业是Windows和Mac终端混合使用,在进行文档加密管理时通常会遇到不兼容的现象,而为了统一…...
MySQL优化-查询优化
MySQL查询优化是指通过调整查询语句、优化表结构、使用索引等方式,提高查询性能的过程。以下是MySQL查询优化的几种方法: 1. 尽量避免使用SELECT* SELECT *会查询表中的所有列,包括不需要的列,这会消耗大量的计算资源和时间。而…...
Ubuntu18.04安装Moveit框架
简介 Moveit是一个由一系列移动操作的功能包组成的集成化开发平台,提供友好的GUI,是目前ROS社区中使用度排名前三的功能包,Moveit包含以下三大核心功能,并集成了大量的优秀算法接口: 运动学:KDL,Trac-IK,IKFast...路径规划:OMPL,CHMOP,SBPL..碰撞检测:FCL,PCD... 一、更新功…...
MongoDB——文档增删改查命令使用
MongoDB 文档增删改查 命令操作描述db.collection.insert() db.collection.insert()将单个文档或多个文档插入到集合中db.collection.insertOne()插入文档,3.2 版中的新功能db.collection.insertMany()插入多个文档,3.2 版中的新功能db.collection.update更新或替…...
【日常总结】Swagger-ui 导入 showdoc (优雅升级Swagger 2 升至 3.0)
一、场景 环境: 二、存在问题 三、解决方案 四、实战 - Swagger 2 升至 3.0 (Open API 3.0) Stage 1:引入Maven依赖 Stage 2:Swagger 配置类 Stage 3:访问 Swagger 3.0 Stage 4:获取 js…...
OpenCV C++ 图像 批处理 (批量调整尺寸、批量重命名)
文章目录 图像 批处理(调整尺寸、重命名)图像 批处理(调整尺寸、重命名) 拿着棋盘格,对着相机变换不同的方角度,采集十张以上(以10~20张为宜);或者棋盘格放到桌上,拿着相机从不同角度一通拍摄。 以棋盘格,第一个内焦点为坐标原点,便于计算世界坐标系下三维坐标; …...
RT-DETR手把手教程,注意力机制如何添加在网络的不同位置进行创新优化
💡💡💡本文独家改进:本文首先复现了将EMA引入到RT-DETR中,并跟不同模块进行结合创新;1)Rep C3结合;2)直接作为注意力机制放在网络不同位置;3)高效…...
qt treeview 删除节点
Qt 中,要删除 QTreeView 中的节点,可以通过操作其模型(QAbstractItemModel)来实现。以下是一个简单的示例,展示如何从 QTreeView 中删除节点。 假设你有一个 QTreeView,它使用了 QStandardItemModel 作为模…...
【单词】【2019】
...
Java自动化驱动浏览器搜索稻香
下载最新的Chrome浏览器 查看chrome版本,在浏览器地址栏输入:chrome://version/ 下载对应的浏览器驱动,将其放到一个目录中,我放到了D:/chromedriver-win64 导入对应的依赖【注意:不要导入最新的版本,最…...
php聊天室通讯系统常用的接口对接函数 curl、file_get_contents()、WebSocket、消息队列
方法有: 1、HTTP请求,可以通过PHP的curl库或者file_get_contents()函数发送HTTP请求来与聊天室接口进行通信; 2、WebSocket协议,可以使用PHP的WebSocket库或者第三方库来与聊天室接口进行对接; 3、使用这些SDK或者包装…...
调 Agent 的 Prompt 太痛苦了?这套“写法 + 测评”救了我
最近在做导购Agent,工程侧已经开发完毕,但调Prompt、做测评,每一个都令我痛苦万分,因为到处都是“翻车现场”:要么“思维太发散”,绕着用户的问题走;要么“工具乱点”,命中一个tool就…...
CANN ops-fft算子开发快速入门
算子开发快速入门:基于ops-fft仓 【免费下载链接】ops-fft ops-fft 是 CANN (Compute Architecture for Neural Networks)算子库中提供 FFT 类计算的基础算子库,采用模块化设计,支持灵活的算子开发和管理。 项目地址…...
通过Taotoken CLI工具一键配置团队开发环境中的大模型接入点
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken CLI工具一键配置团队开发环境中的大模型接入点 当团队开始将大模型能力集成到开发流程中时,一个常见的挑…...
OpenClaw文件访问控制插件:构建AI代理安全防护层
1. 项目概述:为OpenClaw构建文件访问控制层 如果你正在运行一个多用户的OpenClaw智能体,尤其是在Slack、Discord这类团队协作平台上,一个核心的安全隐患会立刻浮现:聊天室里的任何一个人,都可以直接要求AI去修改你的技…...
从‘真假美猴王’到CycleGAN:我是如何用AI把自家猫变成梵高画的
从‘真假美猴王’到CycleGAN:我是如何用AI把自家猫变成梵高画的 去年冬天,我家橘猫"南瓜"在窗台上晒太阳时,阳光透过它蓬松的毛发在墙面上投下斑驳光影,那一瞬间我突然想到:如果能把这画面变成梵高风格的油画…...
从RTL到可执行:手把手拆解基于FPGA的硬件仿真器前端三步骤(Analyze, Elaboration, Synthesis)
从RTL到可执行:手把手拆解基于FPGA的硬件仿真器前端三步骤(Analyze, Elaboration, Synthesis) 在ASIC和FPGA验证领域,硬件仿真(Emulation)已成为验证复杂芯片设计不可或缺的一环。与传统的软件仿真…...
调节效应不只是‘分组回归’:用真实商业案例讲透它在AB测试与产品策略中的应用
调节效应不只是‘分组回归’:用真实商业案例讲透它在AB测试与产品策略中的应用 在互联网产品的迭代优化中,AB测试已成为验证新功能效果的标准工具。但当我们发现某个新功能的整体效果"不显著"时,是否就意味着这个功能毫无价值&…...
CANN/cannbot-skills MoE-Only Scope模板
MoE-Only Scope 模板 【免费下载链接】cannbot-skills CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。 项目地址: https://gitcode.com/cann/cannbot-skills 本模板提供仅将 MoE 模块纳入 SuperKernel scope…...
AI如何突破人文学科认知局限:从海量数据处理到量化分析实践
1. 项目概述:当AI遇见人文,一场认知边界的重塑“人工智能如何突破人文学科的认知局限并引领数字人文复兴”——这个标题听起来宏大,但内核其实非常具体。作为一名在数字人文领域摸爬滚打了十来年的从业者,我亲眼见证了从早期简单的…...
ui-audit:UI审查神器,让你的UI更规范,交互更合理
ui-audit:Tommy Geoco 出品,让 AI 替你做 UI/UX 审查当“设计评审”从会议室里的漫长争论,变成了命令行里的一条指令——这就是 ui-audit 试图改变的事情。如果你曾在深夜对着一个按钮的位置反复纠结,或是在设计评审会上因为“感觉…...
