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

news2024/11/15 19:56:07

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(就是这个流),流的格式或者说他的类型就是TcpStream
    let mut buf = [0; 512];
    //创建一个叫buf的数组,内容为0,长度为512
    loop {
        //该循环表示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,unwrap
    let 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.coloradmin.cn/o/1234673.html

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

相关文章

ky10 server arm 在线编译安装openssl3.1.4

在线编译脚本 #!/bin/shOPENSSLVER3.1.4OPENSSL_Vopenssl versionecho "当前OpenSSL 版本 ${OPENSSL_V}" #------------------------------------------------ #wget https://www.openssl.org/source/openssl-3.1.4.tar.gzecho "安装OpenSSL${OPENSSLVER}...&q…

郎酒“掉队”,经销商们能等来春天吗?

文 | 螳螂观察&#xff08;TanglangFin&#xff09; 作者 | 渡过 有“六朵金花”之称的川酒品牌中&#xff0c;五粮液、泸州老窖、舍得、水井坊都已成功上市&#xff0c;只剩下郎酒和剑南春未上市。 与IPO的“掉队”相对应的&#xff0c;是郎酒在冲刺高端、内部管理、渠道管…

C语言进制转换(1112:进制转换(函数专题))

题目描述 输入一个十进制整数n&#xff0c;输出对应的二进制整数。常用的转换方法为“除2取余&#xff0c;倒序排列”。将一个十进制数除以2&#xff0c;得到余数和商&#xff0c;将得到的商再除以2&#xff0c;依次类推&#xff0c;直到商等于0为止&#xff0c;倒取除得的余数…

Python之staticmethod:让你的代码更简洁高效

概要 在Python中&#xff0c;staticmethod是一种非常有用的装饰器&#xff0c;它可以将一个方法转换为静态方法&#xff0c;使得该方法可以通过类名或实例名直接调用&#xff0c;而不需要传入self参数。staticmethod的使用可以让代码更加简洁、高效&#xff0c;同时也可以提高…

Fiddler抓包看这篇就够了:fiddler设置弱网测试

弱网测试 概念&#xff1a;弱网看字面意思就是网络比较弱&#xff0c;我们通称为信号差&#xff0c;网速慢。 意义&#xff1a;模拟在地铁、隧道、电梯和车库等场景下使用APP &#xff0c;网络会出现延时、中断和超时等情况。 自动化测试相关教程推荐&#xff1a; 2023最新自…

DeepMind 推出 OPRO 技术,可用于优化 ChatGPT 提示

本心、输入输出、结果 文章目录 DeepMind 推出 OPRO 技术&#xff0c;可用于优化 ChatGPT 提示前言消息摘要OPRO的工作原理DeepMind的研究相关链接花有重开日&#xff0c;人无再少年实践是检验真理的唯一标准 DeepMind 推出 OPRO 技术&#xff0c;可用于优化 ChatGPT 提示 编辑…

vue-quill-editor 使用

vue-quill-editor 安装 npm install vue-quill-editor -S 使用 .....<quill-editorstyle"padding-left: 0;padding-top: .0px;margin-top: 30px;"ref"editorRef" v-model"params.content" class"ql-editor" :options"editor…

PG数据中DBeaver上传csv文件作为数据表

DBeaver 是一个开源的数据库工具&#xff0c;还是蛮好用的&#xff0c;有时候需要我们上传数据做表&#xff0c;数据为CSV格式的&#xff0c;DBeaver本身自带有功能实现的。 可打开连着的数据库&#xff0c;找到模式&#xff0c;点到下面的表里&#xff0c;选择一个表直接导入…

【Java】乡镇卫生院、社区卫生服务中心云HIS源码

云HIS采用云端SaaS服务的方式提供&#xff0c;用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、智能化、扩展化等设计方法&#xff0c;覆盖了基层医院机构的主要工作流程&#xff0c;能够与监管系统有序对接…

Golang基础-面向对象篇

文章目录 struct结构体类的表示与封装类的继承多态的基本要素与实现interface空接口反射变量的内置pairreflect包解析Struct TagStruct Tag在json中的应用 struct结构体 在Go语言中&#xff0c;可以使用type 关键字来创建自定义类型&#xff0c;这对于提高代码的可读性和可维护…

安防监控视频云存储平台EasyCVR页面播放卡顿的优化方法

视频监控平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也能支持视…

Milvus 2.3.功能全面升级,核心组件再升级,超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用!

Milvus 2.3.功能全面升级&#xff0c;核心组件再升级&#xff0c;超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用&#xff01; 1.Milvus 2.3版本全部升级简介 Milvus 2.3.0 不仅包含大量的社区呼声很高的新功能&#xff0c;还带来了诸如 GPU 支持、Query 架构…

使用Python处理ADC激光测距数据并绘制为图片(二)

使用Python处理ADC激光测距数据并绘制为图片 说明一、定义全局变量变二、保存和清空原始数据三、拆分原始数据为键值对四、获取标题、FigText、更新统计信息文件五、生成图片六、处理原始数据文件七、主函数入口八、测试结果 说明 1. 主要是将ADC激光测距叠加后的1024Byte数据绘…

vue-admin-template改变接口地址

修改登录接口 1.f12查看请求接口 模仿返回数据写接口 修改方式1 1.在env.devolopment修改 修改方式2 vue.config.js 改成本地接口地址 配置转发 后端创建相应接口&#xff0c;使用map返回相同的数据 修改前端请求路径 修改前端返回状态码 utils里面的request.js

Joern安装与使用

环境准备 Joern需要在Linux环境中运行&#xff0c;所以在Windows系统中需要借助WSL或虚拟机安装。 JDK安装 Joern的运行需要JAVA环境的支持&#xff0c;本次采用的是JDK17&#xff0c;其他版本建议看一下Joern官方文档。 apt install openjdk-17-jre-headless 配置JAVA环境变…

集成仿真软件 PLEXOS 9.0 授权永久完美

PLEXOS是由能源示例发布的能源市场集成仿真软件。能源市场是一个充满活力和活力的市场&#xff0c;在这个大市场中有各种各样的数据和信息模型。观看每日市场发展和大量数据可能会使您感到困惑&#xff0c;并难以进行未来的投资和分析。使用集成和全面的方法是应对这一挑战的唯…

【深度学习实验】注意力机制(四):点积注意力与缩放点积注意力之比较

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 理论介绍a. 认知神经学中的注意力b. 注意力机制 1. 注意力权重矩阵可视化&#xff08;矩阵热图&#xff09;2. 掩码Softmax 操作3. 打分函数——加性注意力模型3. 打分函数——点积注意力与缩放…

ky10 server aarch64 离线安装openssl3.1.4

离线程序 https://gitcode.net/zengliguang/ky10_aarch64_openssl_install.git 输入下面命令执行离线安装脚本 source openssl_offline_install.sh 安装完成

仪表盘:pyecharts绘制

一、仪表盘 在数据分析中&#xff0c;仪表盘图&#xff08;dashboard&#xff09;的作用是以一种简洁、图表化的方式呈现数据的关键指标和核心信息&#xff0c;以帮助用户快速理解数据的情况&#xff0c;并从中提取关键见解。 仪表盘图通常由多个图表、指标和指示器组成&…