rust删除冗余文件小应用(上)

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

前言

由于服务器的硬盘空间快爆了,所以近期一直打算写一个程序来帮我释放一下硬盘空间。

于是开始选语言准备开发,C# 本来是首选的语言,但是最近写C#快写吐了想换换口味。于是想到了GO ,Go语言也是一门静态的编译语言。它可以轻松写出优秀的并发程序,比较受我的恩宠。但想来,好久都没用过Rust 了,对Rust 也不是很熟。不如顺便学习一下Rust好了。于是,这篇文章的核心便由rust来编写了...

本篇将用到async/await、和一些基础的rust代码,我将会边学边讲解

🌳 rust 基础

在rust中,声明方法的关键字是 fn,来看一下一个按行读取文件的方法:

fn read_lines<T>(filename : T) -> io::Result<io::Lines<io::BufReader<File>>>
where T: AsRef<Path> {
    let file = File::open(filename)?;
    Ok(io::BufReader::new(file).lines())
}
复制代码

📢 1.1 泛型

在参数列表前面的一组尖括号是声明泛型的一种方式,这里使用了名称T。其实无论使用什么名称都是一样的,这里的名称只做一个类型占位符。而where字句中描述了T占位符的可能类型。这块和C#的泛型约束语法非常的相像。

📢 1.2 关联函数

没有接触过C++的朋友,一定都纳闷为什么在rust里面调用函数是 "::",而不是 "." 。其实鸭,这个是rust里面的关联函数。它和实例无关,为了区分它与实例方法使用了 "::" 运算符调用,相信大家都对Java中的静态方法不陌生。这里不再解释

📢 1.2 错误处理

注意在参数列表后的 -> 和go 有些类似,在参数列表后声明的函数的返回值类型。此处使用了Result这个Trait 它是rust中 错误处理的核心。结构简单并高效。在File::open(filename) 后面的? ,当这句代码错误时,将会直接返回。后面的ok方法也是

🐱‍🏍 调用调用

image.png

let ok

let ok 是用来解除Result的包装的,加上 if 之后,该代码会只在没有出错时触发

|p| body

这是个啥东西? 长得好奇怪,刚看到这个东东的时候,简直一脸懵。其实这是rust中的 closer(闭包) ,相当于其他编程语言的lambda

match

这是rust中一个很常用的语法,其名为模式匹配。body 里面可以放一些值来枚举。rust 将自动推断

HashSet

我们获取所有路径然后放到HashSet中去,后面就可以拿这个类型去做差集对比了(以此来查找未存在数据库中的路径),最终我们要找到那些路径并删除...

中间碰到的小坑

image.png
使用 p 的时候会将所有权转移到调用处,如果需再次调用的话,应该使用 as_ref 方法获取改实例的引用。这样将不会导致 所有权转移...

总结

好久没有使用过Rust了,之前学习的时候也只是简单了解了一下...
别看就这几行代码,其实我写了一个多小时...
本文涵盖了rust的一些基础,争取下篇文章写出来整个应用程序。要是用C#说不定早就搞完了,唉。我这给自己立的Flag 🚩