Rust初体验感想

最近花了半个月的时间入门了Rust编程语言,简要的写一下对这门语言的感想。

对于困扰于C/C++编程中经常出现的解引用空指针、解引用野指针、内存多次释放这些常见的bug的我来说,Rust的出现完美的解决了以上所有这些问题。首先,Rust中不存在空指针,如果要表示一个值是否存在,只能用Option枚举表示。但unsafe块是个例外。实际上对unsafe块中的指针操作就近乎C中对指针的操作了,因此暂时不考虑它,我不将它纳入Rust自身的特点。对于野指针来说,Rust引入了一个特殊的被称为所有权的概念,该概念的含义是,一个值只能与一个变量绑定,而不能跟多个变量绑定。被称为该变量持有该值。因此当该值的内存空间被释放的时候,该变量自身也无效了,也就不可用了。然而Rust中也确实有引用的概念。引用本质上是C中的指针,编译器会智能判断一个引用它所指的值是否还有效,如果它不能推断,就需要给出该引用的“生命周期”,在该生命周期内引用所指的值都是有效的,也就是说该引用不是野指针。当一个引用变得无效,Rust编译器会拒绝我们继续使用它。因此Rust编译器保证我们不会解引用野指针。当然unsafe块是个例外。对于内存释放,在Rust中一般不需要我们手动释放内存,内存的释放是随着变量达到其生命周期的终点自动进行的。一般对于堆内存,当指向该堆的指针达到生命周期的终点之后会自动释放其(对于有多个指向同一个堆的指针来说,当抢引用计数变为0时自动释放堆内存)。这一切都是Rust运行时保证的,而这与GC又完全不同,这一切是自动的而非被动的过程。因此没有GC的运行时开销。

Rust中的枚举是一个神奇的特性。它融合了C/C++中的struct、enum和union这三者的全部特性。它的枚举的每一种变体本质上都是一个结构体 而整个enum本身实际上是代表它所有变体的一个union。当仅需简单的枚举时,该结构体为空结构体,当需要给枚举变体附加附加复杂的内部结构时,尽管添加吧!你可以丝滑的使用添加的结构。具体内容见Rust match表达式。

说到表达式,Rust中所有不以分号结尾的都是表达式。而以分号结尾的表达式就是语句。rust将这两者的关系定义得非常易懂也抽象得十分到位,在日常编程过程中,可以利用if表达式(没错,是表达式不是语句)来实现一些比较简洁的语法结构。

还有泛型编程和接口的概念,这些都使得代码重复率大大减少,降低编写重复代码。更多细节此处不展开。

这门语言给我另一个感触最深的方面是它对其他所有已有语言和编程实践的良好融合。就语言而言,我所学习的所有语言都能在其中找到影子。比如C++中的移动语义对应所有权概念,枚举这一个特性就覆盖了C/C++中的枚举、共同体、结构体这三个特性。还有impl块中的self参数,和Python的类对象方法中的第一个参数self如出一辙。至于trait的概念和Java、Typescript中的interface的概念十分相似,而在C++中,该概念被表达为纯虚方法。以及大部分编程语言都有的命名空间的概念,其语法和C++相似,也是使用双冒号表示子命名空间。至于编程实践,cargo工具可以说在npm、apt、brew这些包管理工具的实践上打造了一个集项目依赖管理、二进制应用程序分发以及文档提取生成、单元集成测试与一体的超级管家,它在Rust学习者中就如同派蒙同旅行者的关系一样。

Rust还有一个十分庞大友善的社区,你可以在crates.io找到它们。

没时间了,先去赶火车啦

 

你可能感兴趣的:(rust)