Rust 历险记
小代码建议 #1
Rust 诞生后的几年里,我经常会解释 Rust 是一门多么神奇的语言,阐述它将如何改变系统编程世界,以及用 Rust 编写代码是多么令人愉悦。
几个月前,我终于抽出时间尝试了一下。结果糟透了。该死的借用检查器什么都不让我做。我什么有用的代码都编译不出来。尽管用各种语言编程多年,我还是觉得自己完全无力应对。我决定放弃 Rust,专注于其他事情。
尽管最初感到失望和沮丧,我还是无法忘掉 Rust。它的前提太有前途了,让人看了就舍不得放弃。再说,任何编程语言都无法打败我!不过,它还可以等。现在的工作量太大了。也许几年后,我会写 Rust。
然而,使用 Rust 的体验却截然不同。Rust 工具简直太棒了。作为一个彻头彻尾的 Windows 用户,我已经习惯了开源工具(尤其是命令行工具)在 Windows 上不受支持。(不,Cygwin 不是一个有效的解决方案。)我不怪开发者——他们在 Linux 上工作。即使他们有时间花在 Windows 移植上,他们也不一定有 Windows 机器来测试。然而——我已经习惯了失望。这就是为什么,当我第一次听说rg
(一个很棒的grep
替代品)和fd
(一个很棒的find
替代品)时,我就知道它们在 Windows 上无法运行。但是,出于乐观的心态,我还是检查了一下。幸好我这么做了。
要安装 Rust 工具,最简单的方法是安装 Rust 工具集并进行编译。在其他语言中这都是一项艰巨的任务,但在 Rust 中却轻而易举。
- 前往rustup.rs并安装 Rust(Linux 上单个命令行,Windows 上单个可执行文件)
cargo install ripgrep fd-find
- 就是这样。真的。现在使用工具吧。
正是在那时,我意识到 Rust 的神奇之处。即使完全忽略这门语言本身,它的工具和包管理功能也无与伦比。我之前发布过 Python 包,它简洁的发布和安装机制让我惊叹不已。而之前用过 C 和 C++ 的我,对一个带有包管理功能的系统编程更是赞叹不已。所以,尽管我仍然对 Rust 的借用检查器有些畏惧,但我还是决定我的下一个 CLI 工具将用 Rust 编写。如此轻松的部署过程就此彻底结束。
几个月后,我终于发现自己需要一个新的 CLI 工具。我面临一个连续的日志,我想过滤掉重复项。sort -u
排序,所以它不能在流上工作。当然,可能有一些我可以使用的方法sed
或awk
魔法,但我想要一些简单的东西。此外,一个过滤掉重复项的工具似乎是开始使用 Rust 的完美初学者项目。所以我继续创建uq
。完成后,我在crates.io上发布了它。cargo install uq
在第二台机器上,它起作用了。Windows 和 Linux 都适用。一个朋友试了一下,它真的有效!我从来没有过如此愉快的部署经历。从源代码安装实际上比发送编译后的二进制文件更容易!而且它开箱即用,跨平台工作。
不久之后,我想用正则表达式对一些日志条目进行分组。我四处寻找,却找不到简单的方法。所以,我又一次转向了 Rust。一番折腾之后,第一个版本groupby
终于完成了。耶!
不久之后,我经历了人生中最棒的开源体验之一。有人开始使用groupby
,查看了我糟糕的代码,并发布了这个问题:
小代码建议 #1
你好
我发现这个小程序对我做的很多事情都很有用(我通常结合使用 sed、sort 等来做类似的事情)。我也研究了代码。我猜你还在学习 Rust,对吗?能给我一些小建议吗?
- 我瞥见至少一个可以通过用户输入触发的展开(给出太大的组 ID),这将导致丑陋的错误消息而不是有用的消息。
- 你选择
BTreeMap
/BTreeSet
是出于什么特殊原因吗?是因为元素的顺序吗?如果不是,HashMap
那么 andHashSet
可能会更快。 - 两种变体(unique 与 all)看起来非常相似,仅在内部数据类型和用于
push
/ 的方法上有所不同insert
。我认为只需一段对该类型通用的代码,然后添加您自己的特征来实现添加操作即可。您想让我向您展示这样的代码吗?
能有一位 Rust 经验丰富的人来帮我改进我那非常幼稚的代码真是太好了。而且这是我第一次收到“这太棒了,我能帮你吗?”这样的评论,而不是“这太棒了,我也想要这个”这样的评论。
目前,我花在 Rust 借用检查器上的时间比实际编写代码的时间还多。但我(几乎)确信这是由于缺乏经验造成的。好的一面是,我在检测其他语言的生命周期问题方面也做得越来越好了。
所以,对于还没有尝试过 Rust 的人,我强烈推荐使用基于 Rust 的工具。就为了享受开箱即用(和编译!)的奇妙体验。之后,如果你选择真正使用它来编写代码,一定要做好迎接一些坎坷的准备。朋友们告诉我,用一段时间后,Rust 会变得更容易,从而加快他们的开发速度。我还没达到那种程度,但我正在努力。
文章来源:https://dev.to/tmr232/adventures-in-rust-56fc