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

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

它的静态类型内存安全并发性等特点使其在系统编程、嵌入式系统网络编程等领域有着广泛的应用。对于初学者来说,选择一些合适的练手项目可以帮助他们更好掌握Rust语言的特点和技巧。以下是一些适合Rust练手的项目,难度从易到难,可以让初学者逐步提高技能

一、简单级别练手项目:

我用Rust写了一个练手项目是一个股票查询应用代码大约500行,效果如下

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

最后这个项目输出exe只有600k,在windows版本运行无任何依赖,可惜的是Windows 8等早期版本中文Terminal有bug,会导致窗口对不齐,windows10以后没问题了。

二、中级级别的练手项目:

前几天刚好用python结合fastapi做了一个简单web应用倒计时

效果展示

依次输入倒计时的:年、月、日、时,就可以自动计算当前时间距离倒计时日的时间间隔

生成基础的显示单元

使用pythonmatplotlib,把我们需要显示的基础字符转换成图像我们这里需要显示这几个内容:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, day, hou, minsec

全都放在一个文件夹下:

这个功能实现save2number.py模块里面

如果我们为了在终端里面显示4这个数字我们需要读取这个数字的图像,并且对图像的每一个像素转换成字符串然后保存向量里面。

为了可以并排显示多个数字,再对单个数字的字符串向量做拼接。就可以并排形成多个数字了。 比如说我要显示:5169。那么显示出来的效果就是这样的:

既然我们都可以显示数字其实显示这些简单字符也是可以的。比如这样的效果

感受:

三、高级级别的练手项目:

编写一个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) -&gt; io::Result<()&gt; {
    //该函数用来处理client就是这个流),流的格式或者说他的类型就是TcpStream
    let mut buf = [0; 512];
    //创建一个叫buf数组内容为0,长度为512
    loop {
        //该循环表示server端永久提供服务,因为默认服务器为永不关闭let bytes_read = stream.read(&amp;mut buf)?;
        //从流里面读内容,读到buf中
        if bytes_read == 0 {
            return Ok(());
            //如果读到的为空(即0),则说明已经结束了
        }
        stream.write(&amp;buf[..bytes_read])?;
        //否则把它写回去
        thread::sleep(time::Duration::from_secs(1));
        //调用sleep函数实现服务间隔间隔1s
    }
}

fn main() -&gt; io::Result<()&gt; {
    let listener = TcpListener::bind("127.0.0.1:8080")?;
    //定义一个listenerbind函数里面填写的是监听的的ip端口号,?是一种简写,等价于except,unwrap
    let mut thread_vec: Vec<thread::JoinHandle<()&gt;> = 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直接连接severfor _ in 0..10 {
        let mut input = String::new();
        //定义一个String类型的输入
        io::stdin().read_line(&amp;mut input).expect("Failed to read!");
        //从标准输入读入一行读入input里面,如果有问题的话,提示读取失败”
        stream.write(input.as_bytes()).expect("Failed to write!");
        //把input读取内容转换成bytes后,写到stream流里面去,如果写入失败提示写入失败”

        let mut reader = BufReader::new(&amp;stream);
        //从stream流创建一个读,目的是要从我们server端读,
        let mut buffer: Vec<u8> = Vec::new();
        //用Vector创建一个buffer变量 
        reader.read_until(b'n', &amp;mut buffer).expect("Failed to read into buffer");
        //一直读到换行为止(b'n'中的b表示字节),读到buffer里面
        println!("read from server: {}", str::from_utf8(&amp;buffer).unwrap());
        //把读取buffer中的内容打印出来
        println!("");
        //再来一个换行美化输出
    }
    Ok(())
}

运行结果

server运行 cargo run 编译运行程序

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

四、结论:

以上是一些适合Rust练手的项目,难度从易到难,可以让初学者逐步提高技能。通过这些项目的实践,初学者可以更好掌握Rust语言的特点和技巧,深入了解系统编程、网络编程等方面的知识。同时,这些项目也能够帮助他们锻炼面向对象编程泛型的使用方法提高编程能力,为未来更复杂应用程序的实现打下坚实的基础。

原文地址:https://blog.csdn.net/weixin_52908342/article/details/134538435

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_46616.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注