陈天 · Rust 编程第一课
陈天
Tubi TV 研发副总裁
23195 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
基础篇 (21讲)
陈天 · Rust 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

加餐|期中测试:参考实现讲解

把输出对象抽象成 Write
使用泛型
剥离主要逻辑
推荐了一个关于数据结构内存布局的视频
添加了命令行处理逻辑
编写了单元测试
提供了两个方法给 GrepConfig
介绍了如何写出好的实现
实现了一个简化版的 grep 工具
进度条过半
完成了 rgrep 工具的实现
延伸阅读
期中测试:来写一个简单的 grep 命令行
欢迎分享给身边的朋友
下节课进阶篇见
Rust 基础篇学习完成
上次总结后续的文章
总结结果

该思维导图由 AI 生成,仅供参考

你好,我是陈天。
上一讲给你布置了一份简单的期中考试习题,不知道你完成的怎么样。今天我们来简单讲一讲实现,供你参考。
支持 grep 并不是一件复杂的事情,相信你在使用了 clap、glob、rayon 和 regex 后,都能写出类似的代码(伪代码):
/// Yet another simplified grep built with Rust.
#[derive(Clap, Debug)]
#[clap(version = "1.0", author = "Tyr Chen <tyr@chen.com>")]
#[clap(setting = AppSettings::ColoredHelp)]
pub struct GrepConfig {
/// regex pattern to match against file contents
pattern: String,
/// Glob of file pattern
glob: String,
}
impl GrepConfig {
pub fn matches(&self) -> Result<()> {
let regex = Regex::new(&self.pattern)?;
let files: Vec<_> = glob::glob(&self.glob)?.collect();
files.into_par_iter().for_each(|v| {
if let Ok(filename) = v {
if let Ok(file) = File::open(&filename) {
let reader = BufReader::new(file);
|- for (lineno, line) in reader.lines().enumerate() {
| if let Ok(line) = line {
| if let Some(_) = pattern.find(&line) {
| println!("{}: {}", lineno + 1, &line);
| }
| }
|- }
}
}
});
Ok(())
}
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以“期中测试:来写一个简单的 grep 命令行”为题,详细介绍了如何使用 Rust 语言编写一个简单的 grep 命令行工具。作者通过展示简单实现代码并指出问题,然后优化代码,使其更易于测试和维护。在优化过程中,作者提出了剥离主要逻辑、使用泛型、抽象输出对象等方法,并展示了如何编写单元测试。最后,作者展示了如何在命令行中运行这个简单的 grep 工具,并总结了 Rust 语言的优势和适用场景。 通过这篇文章,读者可以深入了解 Rust 语言的特点和优势,以及如何使用 Rust 编写高质量、高性能的命令行工具。文章内容丰富,适合对 Rust 语言感兴趣的读者阅读学习。同时,读者还可以学习如何使用 Rust 的特性来编写简洁、高效的代码,以及进行代码优化和测试。这篇文章为读者提供了一个生动的实例,展示了 Rust 语言的应用和价值,对技术人员具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《陈天 · Rust 编程第一课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • Bitstream
    老师有没有遇到rust-analyzer下,`use thiserror::`无法提示补全的情况?

    作者回复: 有时候会卡住,需要等一下,或者把 cargo 相关的进程杀一下

    2021-11-27
  • dva
    这几篇文章看下来,结构设计相关知识也收获良多,感谢老师

    作者回复: 👍

    2021-11-19
  • 老实人Honey
    https://github.com/clap-rs/clap/issues/2917 clap v3.0.0-beta.4 break change了,要调整一下

    作者回复: github 上面的代码已经改了

    2021-11-08
  • linuxfish
    writer.write(path.display().to_string().green().as_bytes())?; 这一行的设置颜色貌似没有起作用,换了其它颜色也是没效果

    作者回复: 你的 terminal 是否支持 ansi color?你需要使用支持颜色的 terminal

    2021-11-01
    3
  • 野山门
    看完了附带的视频,对数据类型的内存结构有一个清晰的认识。感谢!

    作者回复: 👍

    2021-10-28
  • 记事本
    老师,必须改成这样才可以换行生效啊 writer.write(b"\n")?;

    作者回复: 呃,又是稿件粘贴的问题,自动多加了一个转义的 "\"。我让编辑帮忙更新。 你也可以看 github 上的完成代码:https://github.com/tyrchen/geektime-rust/blob/master/mid_term_rgrep/src/lib.rs。这个代码是经过测试和 cargo check/clippy 的。

    2021-10-16
    3
  • 记事本
    use std::io::self self在这里指的是什么啊

    作者回复: 就是 std::io。 一般 use std::io 就可以了,但如果想同时引入自己以及自己底下的结构,可以用 self,比如: use std::io::{self, Read};

    2021-10-15
    7
  • Simon
    老师, 文件路径的颜色不能正常显示 我修复了一下, 见PR https://github.com/tyrchen/geektime-rust/pull/10
    2022-04-28
    3
  • 沈畅
    这个题完全不会做,还得学各种库啊
    2022-08-12归属地:江苏
    2
  • woJA1wCgAA14JCXna23FAiisVJJCYY...
    `stdout` 输出这里会不会有多个线程同时写 `io` ,导致 `path` 和 `matches` 交错输出的情况呀
    2022-03-26
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部