随着 Rust 语言的大火,前端圈里掀起了一股 Rust 风 —— 一切能用 Rust 实现的都在尝试使用 Rust 重写,比如最近很火的对标 Babel 的 JavaScript/TypeScript 编译器 swc,相信很多人都已经尝试过了。
对于我们前端来说,这么火的语言,当然不能放过了,必须跟上时代的潮流。
一、什么是 Rust
Rust 是由 Mozilla 主导开发的通用、编译型编程语言。设计准则为 “安全、并发、实用”,支持函数式、并发式、过程式以及面向对象的程序设计风格。 —— 维基百科
二、语言特点
1、语言特点
Rust 在深层语法上跟元语言家族的语言像是 Haskell 更接近。基本上一个函数体的每个部分都是表达式,甚至是控制流操作符。
2、内存安全
在安全代码里不允许空指针,悬垂指针和数据竞争。数值只能用一系列固定形式来初始化,要求所有输入已经被初始化。
3、内存管理
不使用自动垃圾回收系统,通过 RAII 来管理内存和资源,还可选引用计数。
4、所有权
所有的值都有一个唯一的属主,值的有效范围跟属主的有效范围一样。
5、类型多态
Rust的类型系统支持一种类似类型类的机制,叫“traits”,是被Haskell激发灵感的。这是一种用于特定同质法的设施,通过给类型变量声明添加约束来实现。其它来自Haskell的特性,如更高类型多态还没有支持,具体可查看:Rust 类型多态。
三、数据类型
Rust 总共有以下几种类型:整数型、浮点型、布尔型、字符型、复合类型。
1、整数型 (i、u)
Rust 语言的类型类似于 C 系列的语言,整形数据会根据是否有符号分为有符号和无符号类型。
位数 | 有符号 | 无符号 |
---|---|---|
8-bit | i8 | u8 |
16-bit | i16 | u16 |
32-bit | i32 | u32 |
64-bit | i64 | u64 |
128-bit | i128 | u128 |
... | ... | ... |
整形默认类型是 i32。(i、 u 表示的是 int、uint)
代码语言:javascript复制let a = 10; // i32
let b: i64 = 20; // i64
2、浮点型(f)
Rust 与其它语言一样支持 32 位浮点数(f32)和 64 位浮点数(f64)。默认情况下,浮点型数据类型是 64 位浮点数,因为现代计算机处理器对两种浮点数计算的速度几乎相同,但 64 位浮点数精度更高。
代码语言:javascript复制let a = 10.0; // f64
let b: f32 = 20.0; // f32
3、布尔型 (bool)
与 js 一样,值为 true 或 false。
4、字符型 (char)
字符类型大小为 4 个字节,代表 Unicode 标量值。
注意:由于中文文字编码有两种(GBK 和 UTF-8),所以编程中使用中文字符串有可能导致乱码的出现,这是因为源程序与命令行的文字编码不一致,所以在 Rust 中字符串和字符都必须使用 UTF-8 编码,否则编译器会报错。
代码语言:javascript复制let c = 'a';
5、复合类型
数组想必大家都很熟了,就是由中括号包括的一组相同类型的数据,但是我们需要知道的是,Rust 中的数组是固定长度的,也就是说我们不能在确定一个数组后再去进行新增或删除的操作。
代码语言:javascript复制let arr = [1, 2, 3, 4, 5];
let arr2: [i32; 5] = [1, 2, 3, 4, 5]; // 长度为5的i32数组
let arr3 = [1; 3]; // 等于[1, 1, 1]
let one = arr[0]; // 1
Rust 还有一个元组类型,它可以包含不同的数据类型。
代码语言:javascript复制let tup: (i32, f32, char) = (10, 20.0, 'a');
四、结构体
结构体有点类似我们 ts 中的 interface
代码语言:javascript复制struct Person {
name: String,
sex: String,
age: u32
}
let p1 = Person {
name: String::from("abc"),
sex: String::from("male"),
age:18
}
// 结构体更新语法,类似js的解构
let p2 = Person{
name: String::from("123"),
..p1
}
五、枚举类
代码语言:javascript复制enum Phone {
IPhone, Huawei
}
枚举类常常与 match 语法一起使用,用来实现分支结构,类似其他语法中的 switch,但是 Rust 中并不支持 switch。
代码语言:javascript复制fn main() {
enum Phone {
IPhone(u32),
Huawei {url: String},
}
let phone = Phone::IPhone(123);
let phone2 = Phone::Huawei {url: String::from("hahaha")};
match phone {
Phone::IPhone(i) => {
println!("{}", i);
},
Phone::Huawei { url } => {
println!("{}", url);
}
}
match phone2 {
Phone::IPhone(i) => {
println!("{}", i);
},
Phone::Huawei { url } => {
println!("{}", url);
}
}
}
// 123
// hahaha
match 除了能够对枚举类进行分支选择以外,还可以对整数、浮点数、字符和字符串切片引用(&str)类型的数据进行分支选择。
对非枚举类进行分支选择时必须处理例外情况,用下划线 _ 表示。
六、所有权
所有权是 Rust 语言为高效使用内存而设计的语法机制
所有权概念是为了让 Rust 在编译阶段更有效地分析内存资源的有用性以实现内存管理而诞生的概念。
代码语言:javascript复制// 移动
// 这种情况下无法访问第一个变量
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1); // 错误!s1 已经失效
// 克隆
// 这种可以
let s1 = String::from("hello");
let s2 = s1.clone();
println!("s1 = {}, s2 = {}", s1, s2);
紧追技术前沿,深挖专业领域
扫码关注我们吧!