跟拼写检查器还是有点渊源的。想当初做数学建模的时候,就遇到过一次类似的问题,于是去网上搜到 Peter Norvig 的教程,写的非常好,当时看到短短二十行代码就能很好解决这个问题,实在是惊艳。而我也是从那个时候开始学习 Python 的。当然,以我初学者的水平要想一时间完全看懂他的代码是不太可能的,不过还是能理解大体的流程,做了一定修改后留作自用。

到现在大概过去三年了,重新遇到了 query rewriting 问题,虽然这次并不需要用到这段代码了,不过作为一个例子来练手 Rust 也是不错的,毕竟看了好久的 Rust 文章和代码,抄过一些引擎,感受过语法的复杂却没自己写过,实在是不应该。

一开始的思路很简单,直接对照着 Python 版本做翻译就好了。好久没有接触静态语言了,每个变量都要考虑类型问题,指针更需要认真对待,而且 Rust 里面还有生命周期的问题,每个变量什么时候生成,能存活到什么时候都要心里有数。这一点一开始没觉得又什么,天真地以为能一眼看出来,应该很容易 debug。但是当遇到借用检查器的问题时,就真的一脸懵逼了,好好的一个 closure 里面怎么就有一个变量活得不够长呢?

一开始要适应 Rust 真的非常痛苦了,跟当初刚学编程接触 C 语言有一拼,不过也有很多不一样的地方:

  1. C 的资料非常多,当然也不乏各种小白瞎写的和各种复制粘贴的,Rust 资料就少得多了,基本都是文档和社区的,还有一些 StackOverflow 和 Reddit 上面的,总之资料很有限,而且不一定有对应的问题。
  2. C 虽然发展了很多年了,但是初学者接触的各种函数接口基本都固定了,而 Rust 到现在还发展地很激进,可能你查到的写法已经不能用了,而且有时候对应的文档还没有更新,这时候你又偏偏用 nightly 版本,那么很不幸,你只能靠插件的提示自己解决问题了。
  3. Rust 还很新,虽然它的报错提示做得很好且一直在改进,但是难免有很多提示都不够准确,让人摸不着头脑。
  4. Rust 相关的生态还不够完善,甚至是一些基本的东西也可能不完善,我用到的一个 max_by_key 居然还不支持 float 型,只好该用 cmp 了。
  5. Rust 社区还是非常活跃的,只不过中文社区基本废弃了,虽然使用英文对开发者是基本要求了,不过还是希望能有中文的活跃社区帮助更多的人来学习这门语言。(说起来我为了写好英文版的提问,自己看了几遍问题就自己想出来,真的是很尴尬)

中间最崩溃的确实还是借用检查器的问题,怪不得 Lo 姐会说这个把她搞得不想碰 Rust 了。当然也有报错信息不到位的问题,不过新手确实很容易卡在这里,而且很可能查到的资料都没法给出正确的提示。我自己也一度怀疑人生了,然后去搜了几个现成的 Rust 版拼写检查器,发现别人写法非常老实,各种 iffor 就没有什么问题,而我非要用什么 itermatchcollect 之类的写法,接连碰壁。不过最后能成功写出来,确实感觉学到了不少东西,也对 Rust 理解更深了,还是值得的。(虽然我差不多花了一天的时间写了一个可能用 Python 十几分钟就能实现的功能)

磕磕绊绊,还是把代码写完了,真的是好久都没有这种体验了,过程虽然痛苦但是结果还是很幸福,追求技术的幸福。

总的来说,Rust 还是一门非常优秀的语言,现在新出的 deno 好像也要大规模使用 Rust 了,我觉的自己的选择还是没错的,虽然现在基本上看不到有人招 Rust 的,这不影响。自己喜欢就好,可以自己拿来做一些合适的项目,然后开源出去。