学习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.mzph.cn/news/156760.shtml

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

相关文章

DAY59 503.下一个更大元素II + 42. 接雨水

503.下一个更大元素II 题目要求&#xff1a; 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&am…

【运维】永久关闭selinux不当,导致无法启动

现象: 卡centos loading进度条 按esc键发现,启动报错: Failed to load SElinux policy ,freezing 可能的原因: selinuxdisabled 写错成disable 或者 错误的把selinuxtype改了&#xff0c;要改文中红框的部分。 解决方案: 1. 重启 2. 出现选择画面的时候 按e 3. 方向下键…

5-4计算一串字符的空格数字字符其他

#include<stdio.h> int main(){char c;int space0;//空格int letters0;//英文字母int numbers0;//数字int others0;//其他字符printf("请输入一行字符&#xff1a;");while((cgetchar())!\n)//获取字符的内容&#xff0c;到\n停止{if(c>a&&c<z|…

树与二叉树堆:二叉树

二叉树的概念&#xff1a; 二叉树是树的一种&#xff0c;二叉树是一个节点&#xff0c;最多只有两个子节点&#xff0c;二叉树是一个特殊的树二叉树的度最大为2 从上图可得一棵二叉树是结点的一个有限集合&#xff0c;该集合: 或者为空由一个根结点加上两棵别称为左子树和右子…

P2 C++变量

前言 一 C变量的作用 本期我们来讨论一下c 中的变量。 在一个 C 程序中&#xff0c;大部分内容实际上都是在使用数据。我们操作任何类型的数据&#xff0c;如包括我们想要改变、想要修改&#xff0c; 想要读和写数据。我们都需要把数据存储进叫做变量的东西里面。变量允许我们…

电子科技大学 分布式系统 期末复习笔记

第一章 为什么需要分布式系统&#xff1a;功能分离&#xff0c;固有的分布性&#xff0c;负载均衡&#xff0c;可靠性&#xff0c;经济性。 定义&#xff1a;分布式系统是这样一种系统&#xff0c;其中位于联网计算机上的组件仅通过传递消息来通信和协调它们的操作。 特点&am…

【ctfshow】web入门-信息搜集-web11~20

【ctfshow】web入门-信息搜集-web11~17 web11_域名其实也可以隐藏信息&#xff0c;比如flag.ctfshow.com 就隐藏了一条信息web12_有时候网站上的公开信息&#xff0c;就是管理员常用密码web13_技术文档里面不要出现敏感信息&#xff0c;部署到生产环境后及时修改默认密码web14_…

【漏洞复现】IP-guard WebServer 存在远程命令执行漏洞

漏洞描述 IP-guard是由溢信科技股份有限公司开发的一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危…

【C++】map multimap

文章目录 1.map介绍2.map的使用3.multimap介绍4.multimap的使用 1.map介绍 map的文档 翻译&#xff1a; map是关联容器&#xff0c;它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 在map中&#xff0c;键值key通常用于排序和惟一地标识元素&#x…

动态时钟实现

前端HTMLCSS3JavaScript实现动态时钟 一、实现思路概述二、源代码(包含HTML、CSS、JS)三、图片资源与效果截图1. 图片资源2. 效果截图 一、实现思路概述 1. 通过HTML搭建基本时钟的页面结构(这里将时钟图片资源作为背景图&#xff09;2. 将时钟背景和时/分/秒图片进行CSS位置居…

京东数据分析(京东数据采集):2023年10月京东平板电视行业品牌销售排行榜

鲸参谋监测的京东平台10月份平板电视市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;10月份&#xff0c;京东平台上平板电视的销量将近77万&#xff0c;环比增长约23%&#xff0c;同比则下降约30%&#xff1b;销售额为21亿&#xff0c;环…

Spring-IOC-FactoryBean机制(难点且重点)

1、第一个案例 1.1、Book.java package com.atguigu.ioc; import lombok.Data; Data public class Book {private String bid;private String bname; }1.2、Book2.java package com.atguigu.ioc; import lombok.Data; Data public class Book2 extends Book {private String co…

软件测试银行面试项目经验讲解

前言 业务&#xff1a; 银行类app具体模块业务讲解&#xff1a; 掌上生活&#xff08;消费/理财&#xff09; 消费&#xff1a; 与电商平台业务类似 饭票&#xff1a;GPS定位城市服务、饭票购买消费、餐厅查询、代金券、周三五折、banner图、我的饭票、我的抵扣券 影票 …

最新绿豆APP源码苹果CMS影视插件版本/原生JAVA源码+反编译开源+免授权

源码简介&#xff1a; 最新绿豆APP源码苹果CMS影视插件版本&#xff0c;它是原生JAVA源码反编译开源免授权&#xff0c;绿豆影视对接苹果CMS&#xff0c;它可以支持多功能自定义DIY页面布局。 1、新版绿豆视频APP视频6.1插件版反编译指南及教程 2、后端插件开源&#xff0c;可…

[C++] STL_stack queue接口的模拟实现

文章目录 1、stack1.1 stack的介绍1.2.1 stack的构造1.2.2 进、出栈等接口的模拟实现 2、queue2.1 queue的介绍2.2 queue的使用2.2.1 queue构造2.2.2 入、出队等接口的模拟实现 1、stack 1.1 stack的介绍 stack的文档介绍 1. stack是一种容器适配器&#xff0c;专门用在具有…

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大痛点分析

数字化时代银行网点厅堂营销存在以下5大痛点&#xff1a; 1、业务办理时间较长。目前很多银行业务办理时间仍然较长&#xff0c;可能的原因包括银行业务办理流程比较复杂、柜员操作技能不够熟练、银行系统的稳定性欠佳、网点某段时间客户比较多等。 2、现场提交材料太多。银行…

玩转大模型行业应用,且看盘古大模型全栈工程能力展身手【云驻共创】

AI技术在金融和工业领域的应用不断扩展&#xff0c;促进了金融行业的数字化转型和产业升级。AI提供了专属财富管家和工业范式的解决方案&#xff0c;在金融领域的应用包括风险评估和投资建议&#xff0c;而在工业领域的应用则涵盖了数据分析和机器人操作。与此同时&#xff0c;…

力扣 hot100 最长连续序列 哈希去重 双指针

128. 最长连续序列 ⭐ AC code class Solution {public int longestConsecutive(int[] nums) {if (nums.length 0)// 特判为空的数组&#xff0c;返回0return 0; // set实现去重HashSet<Integer> set new HashSet<>();for (int x : nums)set.add(x);Object[] a…

MyBatis使用注解操作及XML操作

文章目录 1. 注解操作1.1 打印日志1.2 参数传递1.3 增&#xff08;Insert&#xff09;注意1&#xff1a;重命名注意2&#xff1a;返回主键 1.4 删&#xff08;Delete&#xff09;1.5 改&#xff08;Update&#xff09;1.6 查&#xff08;Select&#xff09;1. 配置&#xff0c;…

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏3(附项目源码)

文章目录 先看本次实现的最终效果前言绘制炮塔UI炮塔转向敌人生成炮弹旋转我们的子弹对敌人造成伤害&#xff0c;回收子弹自动发射子弹添加攻击间隔显示伤害字体设计通用泛型单例创建更多炮塔升级增加伤害升级缩短攻击间隔添加货币杀死敌人获取金币源码完结 先看本次实现的最终…