跳转至

Rust 快速上手(勇者获得了村好剑)

系统内核采用的语言是 Rust ,其优秀的运行时性能和代码安全性使得我们的系统更加稳定和高效。Rust 的大部分语言范式与常见语言类似,需要完整学习建议去看看 《Rust 圣经》,本节内的内容均节选于此,尽用于超快速上手,想要真正使用还是去看这本圣经啊。

环境配置

配环境是使用软件的第一步……

在 Linux 或者 macOS 上,使用指令安装 Rust 一行指令即可。

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

在 Windows 上安装 Rust 相对麻烦一点点,需要你完成以下几个步骤

  1. 安装 Microsoft C++ Build Tools. 下载完成后选择 C++ 环境并安装就行了。
  2. 安装 Rustup。下载完成后运行安装程序,选择默认安装即可。(注意,如果这里选择自定义安装,并使用 nightly 版本,可以跳过之后安装 nightly 版本的步骤)
  3. 重新开启一个新的终端,输入 rustc -V 检查安装及环境是否配置成功。

完成 Rust 的安装之后,距离运行我们的系统还差一步,就是需要切换到 nightly 版本。这是由于部分特征在 stable 版本中还未稳定化,我们在系统中采用了一点点 nightly 版本的特性。

rustup install nightly

运行本行指令之后,你的电脑上就有 nightly 版本的 Rust 了。

然后克隆我们的库,进入到库的根目录,切换到 nightly 版本。

rustup override set nightly

此时,我们关于 Rust 的环境配置就完成了。

顺提,此时vscode会报错说系统无法编译,这通常是因为你的电脑环境中没有 CMake 导致的。年轻人的电脑里怎么能没有 CMake 呢?关于 CMake 的安装就不再赘述了。

Rust 基础 - 变量与类型

rust 中的变量可以手动指定变量的可变性,一方面维护了编程的灵活性,另一方面也保证了代码的安全性。同时还能免除一些垃圾检查和实时性检查,简直妙哉。代价只有 rust 语言编译器开发者的头发。 :D

一般来说声明一个变量需要使用关键词 let (实际上这种变量声明方式是一种模式匹配,还有许多花活,这里暂且按下不表)

let x = 5;     // 不可变整数类型
let mut y = 6.; // 可变浮点数类型

变量被使用之后就会被销毁!!!!你可以在调用时添加引用避免被销毁,但是在同一时间同一个变量只能有一个可变引用或者多个不可变引用

rust 是强类型语言,这里强类型的含义甚至要比 C 和 C++ 更胜一筹。rust 中的类型是不可隐式转换的,但是好在 rust 语言服务器会帮助你完成类型推断,在实际代码中我们不需要标注大多数的类型,类型推断器会帮助你搞定。在 rust 中的基础类型有如下几款:

  • 数值类型
  • 有符号整数(i8, i16, i32, i64, i128, isize)
  • 无符号整数(u8, u16, u32, u64, u128, usize)
  • 浮点数(f32, f64)
  • 字符串
  • 字符串字面量和字符串切片(&str)
  • 布尔类型
  • 字符类型
  • 单元类型 ()

Rust 是一门静态类型语言,编译器必须在编译器知道我们所有变量的类型,这点很重要,在之后的工作中,我们会看到这一点的重要性。

一个小小的注释:浮点数只是你理想数字的近似值,也不具备加法结合律,为了保障安全,rust 中没有为浮点数实现 Eq trait 即 == 操作符,不要依赖浮点数的相等性!!!

经典故事: 0.1 + 0.2 = 0.30000000000000004

再顺提,rust 中数值是可以运行方法的,比如 5.0.sin(),这个方法会返回 5.0 的正弦值。

Rust 基础 - 复合类型

字符串 String

元组

元组是多个类型的匿名复合,我们可以轻易地创建和结构元组

fn main() {
    let tup = (500, 6.4, 1); // 创建元组

    let (x, y, z) = tup;  // 解构元组

    println!("The value of y is: {}", y);
}

在这块代码中,我们创建了元组,又使用模式匹配解构了元组

结构体

经典的结构体声明方法

struct User {
    active: bool,
    username: String,
    email: String,
    sign_in_count: u64,
}

枚举

rust 的枚举类型厉害之处在于其可以携带变量(有点 C 中 union 的意思),这样我们可以在一个枚举类型中携带多种类型的数据。

enum PokerCard {
    Clubs(u8),
    Spades(u8),
    Diamonds(char),
    Hearts(char),
}

Rust 基础 - 语句与表达式

简单来说,一句话之后有分号就是语句,没有分号再长也是表达式。你甚至可以在函数最后一行写上一个表达式,这个表达式就是函数的返回值。

Rust 基础 - 模式匹配

最最最最最最最最重要的一章,见 《Rust 圣经》 2.6

Rust 基础 - 函数

其他语言和 Rust 的对比

图 0

你当然也可以单独实现函数,函数的定义如下

fn 函数名称(参数1: 类型1, 参数2: 类型2) -> 返回值类型 {
    // 函数体
}

请注意,函数也是一种类型,你可以将函数作为参数传递给其他函数,这在函数式编程中是非常常见的。

Rust 基础 - 泛型和特征

Rust 不是严格的面向对象语言,但是其也有类似的特性,那就是特征。

最最最最最最最最重要的一章, 见 《Rust 圣经》 3.2

Rust 基础 - 生命周期

Rust 的生命周期是一种非常独特的特性,这是由于 Rust 的所有权系统,生命周期是一种非常重要的特性,但是也是 Rust 中最难理解的特性之一。

生命周期特性使得 Rust 无需垃圾回收器同时也能保证内存安全,这是 Rust 的一大特色。

最最最最最最最最重要的一章, 见 《Rust 圣经》 4.3

此时有人就要叫了:“主播主播你光让我们去看圣经了,写这些图啥呢?” 我当然更加希望大家去看圣经而不是看我这个超级省流简约版本,这个文档只是为了已经熟悉其他语言的人能够借助语言的相似性尽快的上手 Rust, 而真正想要会学会用 Rust 还是需要去看圣经的。