Rust简介
Rust融合了多种编程范式。 Rust最初被设计为系统编程语言,但随着发展,它已经成为了一门更加通用的编程语言,包括系统软件、网络服务、桌面应用程序、嵌入式等。
Rust的 借用检查器(borrow_ checker) 是它区别与其他基于C的语言的关键。它通过强制单一所有权原则促进安全编码。
函数式编程
函数式编程指的是以函数为基础构建块,在函数式编程中,函数被视为一等公民,你可以在任何通常使用变量的地方使用函数。
函数式编程的好处:
- 更加灵活
- 更加透明
- 不变性,它通过消除函数内的常见副作用,使程序更容易维护
面向表达式编程
Rust也是一种支持表达式编程的语言,在表达式编程中,大多数操作是能返回一个值的表达式,而不是什么都不返回的语句。
- 表达式 就是一个返回值且只产生很小副作用或没有的一个或多个操作
- 语句 语句不返回值,但它们可以改变程序状态,
面向表达式编程的好处是:
- 没有副作用,程序更容易维护
- 更加透明,表达式的值完全由其接口定义
- 易于测试,因为表达式是基于接口的
- 更容易编写文档,在没有副作用的情况下,表达式甚至可以替代文档
- 更易于组合
面向模式编程
专业的Rust编程通常涉及大量的模式,Rust使用match进行模式匹配。与C++/Java中的switch语句不同(字符串和整型表达式的单维度模式匹配),在Rust中模式匹配进一步扩展到用户自定义类型和序列的实例。
面向模式匹配编程有几个好处:
- 表达力强,能够将复杂代码简化为更简单的表达式
- 更全面,面向模式是对面向表达式编程的补充
- 更可靠,支持穷举模式匹配,这样更可靠且不容易出错。
特性
一、安全性
- 不可变性是默认行为,以防止意外更改
- 强制检查生命周期的正确性,以防类型悬挂引用等反模式
- 以引用的方式安全使用指针
- 对于大小动态变化的资源,使用资源获取即初始化(RAII)策略进行可靠内存管理
二、所有权
所有权通过单一所有者原则保证安全的内存访问。这一个原则将变量指派给单一所有者,而且拥有不会有超过一个所有者。
三、生命周期
生命周期是Rust的一个重要特性,用于避免程序对已失效的数据进行访问,在Rust中,引用本质上也是指针。如果不加约束可以通过悬挂引用访问当已经被释放的内存区域,从而导致程序崩溃。Rust通过生命周期解决了这个问题。
借用检查器用来对生命周期的正确性进行检查,如果有错误的生命周期,则会编译错误,而生命周期标注是当生命周期存在歧义时开发者需要显式标柱的。
四、无畏并发
当程序从顺序过渡到并发时,通常会进行一个称为强化的过程,以确保多线程代码有安全运行环境,其中一个标准步骤是移除作为共享数据的全局变量,有了无畏并发后就不需要这个强化过程了。
五、零成本抽象
这是Rust中的一个重要特性,是Rust中各个特性都遵循的原则,即无必要就应避免在运行时带来性能上的损失。
Rust术语
- crate,在rust中,crate是最基本的编译单元,常见分类有
- 可执行crate: 一个独立于其他create运行的可执行二进制文件
- 库crate: 一个库,包含一组功能,用于其他create使用,不能独立运行
- 外部crate: 一个外部依赖项。比如crate A引用crate B,但B和A不在同一个包内,那么crate B就是外部crate。或者说依赖。
- 包 一个包由多个crate(包括可执行和库)构成
- 模块 类似于其他语言的命名空间,可以使用模块在一个crate中创建层次化的程序结构,mod也有助于避免名称冲突
- Cargo 在Rust中有几个Cargo相关部分
- Cargo.toml 描述了包,包括依赖项,版本,作者,描述,等等
- Cargo.lock 描述了包依赖项和特定版本,Cargo会自动生成这个文件
- .rs Rust源文件的扩展名
Rust工具
- Rustup Rust安装程序,按照Rust以及整个工具链
- cargo 多功能工具,主要功能是包管理,辅助功能是编译代码、格式化源代码和创建新的crate等
cargo new --lib mylib
- rustc Rust语言编译器,可以将Rust源文件(.rs)编译成可执行文件或库
rustc source.rs
- rustdoc 文档生成器,将Rust源文件中的文档注释编译成帮助文档,并将其输出为HTML格式
- Clippy 综合测试工具
- Rustfmt 将源代码转化为符合Rust风格指南的格式
- rust-analyzer Rust语言服务器,提供智能提示、错误检查、代码补全等功能