学习Rust的心智模型 - kerkour


我们不拐弯抹角:Rust确实 不容易学习。
我想我花了将近1年的时间全职用Rust编程,才变得熟练,不再需要每5行代码就看一次文档。这是一个漫长的旅程,但绝对值得。

它要求你重新思考你在使用其他编程语言时学到的所有心理模型。

这就是为什么我认为分享一下这些年来我在使用Rust时是如何调整我的编程习惯的,可能会很有趣。
 
拥抱编译器
编译器会让你在开始使用Rust时遇到困难。你会讨厌它。你会发誓。你会希望禁用它,把它送进地狱。不要这样做。

编译器应该被看作是一个始终可用的、友好的代码审查器。所以,它不是阻止你的代码编译的东西。相反,它是一个朋友,告诉你你的代码有缺陷,甚至提供如何修复它的建议。

多年来,我见证了编译器所显示的信息的巨大改进,我毫不怀疑,如果今天编译器对一个边缘案例产生了一个晦涩的信息,它将在未来得到改进。
 
及时学习
Rust是一门庞大的语言,你不可能在几周内掌握。而这完全没有问题。你不需要什么都知道就可以开始学习。

在写第一个程序之前,我已经花了很多时间阅读Rust背后的所有计算机科学。这是一个错误的方法。关于Rust的所有特性,有太多的东西需要阅读,而且你肯定不会全部使用它们(你也不应该!)。例如,请永远不要使用non_ascii_idents,它只会带来混乱和痛苦!)。所有这些东西真的很有趣,而且是由非常聪明的人制作的,但它妨碍你完成事情。

相反,拥抱未知,做你的第一个程序。失败。学习。重复。
 
保持简单
不要试图变得太聪明!。如果你在与语言的局限性作斗争(这已经很庞大了),这可能意味着你做错了什么。停止你正在做的事情,休息一下,想想你如何能以不同的方式做事。这几乎每天都发生在我身上。

另外,请记住,你越是在玩弄类型系统的限制,你的代码就越会产生难以被编译器理解的错误。所以,让你和你的同事们帮个忙吧。KISS(Keep It Simple, Stupid)。

倾向于把事情做完,而不是永远不发货的完美设计。重做一个不完美的解决方案要比永远不出货的完美系统好得多。
 
你会预先支付了成本
用Rust编程有时可能会显得比Python、Java或Go慢一些。这是因为,为了进行编译,Rust编译器要求的正确性水平远远高于其他语言。因此,在一个项目的整个生命周期中,Rust将为你节省大量的时间。你在Rust中制作一个正确的程序所花费的精力,是你省下的时间(以及金钱和精神健康!)的1倍-10倍,因为你不必花数小时来调试奇怪的错误。

我在生产中交付的第一个程序是用TypeScript(Node.js)和Go。由于这些语言的编译器和类型系统比较宽松,你必须在代码和外部服务中添加复杂的仪器,以便在运行时检测错误。在Rust中,我从来没有用过这个。
简单的日志记录就是我追踪程序中错误的全部需要。
除此之外,在我的记忆中,我从未在Rust的生产系统中遇到过崩溃。
这是因为Rust迫使你 "预先支付成本":你必须处理每一个错误,并对你正在做的事情非常用心。
 
函数式编程
Rust是(在我看来)在命令式和函数式语言之间的完美结合,以完成工作。这意味着,如果你来自一个纯粹的命令式编程语言,你将不得不放弃一些东西,接受函数式范式。

喜欢迭代器(第3章)而不是for循环。赞成不可变的数据而不是可变的引用,别担心,编译器会对你的代码进行很好的优化。
 
还有几个提示
使用自动化工具来协助你维护你的项目:rustfmt, clippy, cargo update, cargo outdated 和cargo-audit.。