学习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语言的特点和技巧,深入了解系统编程、网络编程等方面的知识。同时,这些项目也能够帮助他们锻炼面向对象编程和泛型的使用方法,提高编程能力,为未来更复杂的应用程序的实现打下坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/200050.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何修改百科内容?百度百科内容怎么修改?

百科词条创建上去是相当不易的&#xff0c;同时修改也是如此&#xff0c;一般情况下&#xff0c;百科词条是不需要修改的&#xff0c;但是很多时候企业或是人物在近期收获了更多成就或是有更多的变动&#xff0c;这个时候就需要补充维护词条了&#xff0c;如何修改百科内容&…

猫12分类:使用yolov5训练检测模型

前言&#xff1a; 在使用yolov5之前&#xff0c;尝试过到百度飞桨平台&#xff08;小白不建议&#xff09;、AutoDL平台&#xff08;这个比较友好&#xff0c;经济实惠&#xff09;训练模型。但还是没有本地训练模型来的舒服。因此远程了一台学校电脑来搭建自己的检测模型。配置…

C++引用

目录 一.概念 二. 引用特性 三. 常引用 四. 使用场景 1&#xff0c;做参数 2&#xff0c;做返回值 五. 传值&#xff0c;传引用效率比较 5.1 值和引用的作为参数的性能比较 5.2 值和引用的作为返回值类型的性能比较 六. 引用和指针的区别 一.概念 引用不是新定义一…

16位 (MCU) R7F101G6G3CSP、R7F101G6E3CSP、R7F101G6G2DSP、R7F101G6E2DSP是新一代RL78通用微控制器

产品描述 RL78/G24微控制器具有RL78系列MCU的最高处理性能&#xff0c;CPU工作频率高达48MHz&#xff0c;设有灵活的应用加速器 (FAA)。FAA是一款专门用于算法运算的协处理器&#xff0c;可以独立于CPU运行&#xff0c;提供更高处理能力。RL78/G24 MCU具有增强的模拟功能和大量…

构建和应用卡尔曼滤波器 (KF)--扩展卡尔曼滤波器 (EKF)

作为一名数据科学家&#xff0c;我们偶尔会遇到需要对趋势进行建模以预测未来值的情况。虽然人们倾向于关注基于统计或机器学习的算法&#xff0c;但我在这里提出一个不同的选择&#xff1a;卡尔曼滤波器&#xff08;KF&#xff09;。 1960 年代初期&#xff0c;Rudolf E. Kal…

LLM之Prompt(二):清华提出Prompt 对齐优化技术BPO

论文题目&#xff1a;《Black-Box Prompt Optimization: Aligning Large Language Models without Model Training》 论文链接&#xff1a;https://arxiv.org/abs/2311.04155 github地址&#xff1a;https://github.com/thu-coai/BPO BPO背景介绍 最近&#xff0c;大型语言模…

oepnpnp - 自己出图做开口扳手

文章目录 oepnpnp - 自己出图做开口扳手概述笔记做好的一套扳手实拍美图工程图END oepnpnp - 自己出图做开口扳手 概述 我的openpnp设备顶部相机安装支架, 由于结构限制, 螺柱的安装位置和机械挂壁的距离太近了. 导致拧紧(手工或者工具)很困难. 也不能重新做相机支架, 因为将…

Michael Jordan最新报告:去中心化机器学习中的契约、不确定性和激励

‍ ‍导读 11月3日&#xff0c;智源研究院学术顾问委员会委员、机器学习泰斗Michael Jordan在以“新一代人工智能前沿”为主题的2023北京论坛 新工科专题论坛上&#xff0c;发表了题为Contracts, Uncertainty, and Incentives in Decentralized Machine Learning&#xff08;去…

深度学习之基于Pytorch的昆虫分类识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介系统架构技术亮点 二、功能三、系统四. 总结 一项目简介 # 深度学习基于 Pytorch 的昆虫分类识别系统介绍 深度学习在图像分类领域取得了显著的成就&#…

什么是强化学习

1.1 强化学习概述 强化学习&#xff08;reinforcement learning&#xff0c;RL&#xff09; 讨论的问题是智能体&#xff08;agent&#xff09;怎么在复杂、不确定的环境&#xff08;environment&#xff09;中最大化它能获得的奖励。如图 1.1 所示&#xff0c;强化学习由两部…

低代码服务商,中小型数字化软件服务商的新出路

数字化时代大背景下&#xff0c;企业信息化向数字化转型成为所有企业发展的必由之路&#xff0c;企业在对业务模式、流程、组织形式、信息技术等方面进行重新定义时&#xff0c;软件必然参与价值创造的全过程&#xff0c;这势必驱使软件成为推动数字化转型的“引擎”&#xff0…

Django 入门学习总结6 - 测试

1、介绍自动化测试 测试的主要工作是检查代码的运行情况。测试有全覆盖和部分覆盖。 自动测试表示测试工作由系统自动完成。 在大型系统中&#xff0c;有许多组件有很复杂的交互。一个小的变化可能会带来意想不到的后果 测试能发现问题&#xff0c;并以此解决问题。 测试驱…

036、目标检测-锚框

之——对边缘框的简化 目录 之——对边缘框的简化 杂谈 正文 1.锚框操作 2.IoU交并比 3.锚框标号 4.非极大值抑制 5.实现 拓展 杂谈 边缘框这样一个指定roi区域的操作对卷积神经网络实际上是很不友好的&#xff0c;这可能会对网络感受野提出一些特定的要求&#xff0…

初识shell脚本

目录 什么是shell脚本 面向过程语言 面向对象 windows 三种处理逻辑 常用的&#xff1a;usr/bin/bash 基本申明 三个基本语法 执行脚本 脚本错误 三种错误区别 set -e set -u 重定向 管道符 变量 常见的shell变量的类型包括 整数的运算 整数运算 $RANDOM 随机…

来吧,SpringBoot的自动配置原理都在这里了

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…

Enterprise Architect安装与使用

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Enterprise Architect概述 官方网站&#xff1a;https://www.sparxsystems.cn/products/ea/&#xff1b;图示如下&#xff1a; Enterprise Architect是一个全功能的、基于…

webpack 中,filename 和 chunkFilename 的区别

filename filename 是一个很常见的配置&#xff0c;就是对应于 entry 里面的输入文件&#xff0c;经过webpack打包后输出文件的文件名。比如说经过下面的配置&#xff0c;生成出来的文件名为 index.min.js。 chunkFilename chunkFilename 指未被列在 entry 中&#xff0c;却…

单图像3D重建AI算法综述【2023】

计算机视觉是人工智能的一个快速发展的领域&#xff0c;特别是在 3D 领域。 本概述将考虑一个应用任务&#xff1a;2D 和 3D 环境之间的转换。 在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编…

C语言入门笔记—static、extern、define、指针、结构体

一、static static修饰局部变量的时候&#xff0c;局部变量出了作用域&#xff0c;不销毁。本质上&#xff0c;static修饰局部变量的时候&#xff0c;改变了变量的存储位置。详见下图&#xff0c;当a不被static修饰和被static修饰的时候。 C/C static关键字详解&#xff…

Spring Cloud学习(九)【Elasticsearch 分布式搜索引擎01】

文章目录 初识 elasticsearch了解 ES倒排索引ES 的一些概念安装es、kibana安装elasticsearch部署kibana 分词器安装IK分词器ik分词器-拓展词库 索引库操作mapping 映射属性索引库的 CRUD 文档操作添加文档查看、删除文档修改文档Dynamic Mapping RestClient 操作索引库什么是Re…