写了几天 Rust 之后,不光被它的 Ownership, Lifetime 折磨的死去活来,还碰上个奇怪的错误处理方式。如果让程序员在 Java, C/C++, Python, Ruby, Scala, Go,甚至是 Lisp 语言之间换着干活,那还都不是难事,但是拉个人去弄 Rust 就会要人命了。
有垃圾回收的语言基本就是想怎么写都成,程序运行时也不会出太大的事,当然性能是个妥协; 像 C/C++ 自己管理内存的语言写出来的程序通过编译也容易,只是执行时很可能会有内存泄漏或地址越界。而选择号称性能与安全兼备的 Rust 语言的话,按照正常思维逻辑写出来的代码能通过编译就是最幸福的事。碰到关于 Ownership, Lifetime 之类的编译问题很多时候当前的 AI 也无解。
所以现在还能用 Java, Python, C# 等写代码是个幸福的事,这种时光应该好好的珍惜。换个角度来想,如果能掌握 Rust 那还怕别的语言吗?
就算能侥幸的应付 Ownership, Lifetime 的问题,Rust 错误处理方式也会让人抓狂,起初大量的用 unwrap() 忽略错误,用多了也会觉得不是一回事。
主流的语言都是采纳 try/catch 方式处理异常方式,异常在栈中向上传播,想在哪一层捕获异常都行,所以才可能在某处集中的处理异常,也让程序结果返回与异常处理得已分离。
有一个视频 什么是正确的错误处理方法【让编程再次伟大#21】介绍了各种编程语言错误处理方式的历史发展,视频博主十分推崇 Rust 的结果错误放 Result 的方式,觉得像 try/catch 那种能够实现关注点分离的方式是便宜了程序员,只有返回 Result<T, E> 的方式才能强制程序员步步小心。那何不让 try/catch 全部抛出 Checked 异常,然而事实是 Spring 框架把许多 Checked 异常转换成了 Unchecked 异常,能程序员处理更方便,且能集中处理异常。