首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Rust基础入门:环境搭建与变量类型详解

Rust基础入门:环境搭建与变量类型详解

作者头像
安全风信子
发布2025-11-16 19:57:30
发布2025-11-16 19:57:30
270
举报
文章被收录于专栏:AI SPPECHAI SPPECH

引言

Rust是一门注重安全、性能和并发的系统编程语言,由Mozilla开发并于2010年首次发布。它结合了低级语言的性能优势和高级语言的安全性特性,通过所有权系统、借用规则和生命周期等机制,在编译时就能捕获许多常见的编程错误,如空指针解引用、缓冲区溢出等。

通过本文的学习,你将掌握Rust的环境搭建方法、基础语法知识、变量定义与使用、数据类型以及所有权系统等核心概念,为后续深入学习Rust的高级特性和实际应用打下坚实的基础。

要点

描述

痛点

编程入门难,环境配置复杂,概念抽象难懂

方案

简单明了的Rust环境搭建和基础语法教程

驱动

掌握Rust语言,开启系统编程之旅,提升技术竞争力

目录

章节

内容

1

Rust语言概述与环境搭建

2

开发工具配置

3

Rust基础语法

4

变量定义与使用

5

数据类型详解

6

所有权系统

7

实战练习与常见问题

1. Rust语言概述与环境搭建

1.1 Rust语言的优势

Rust语言具有以下显著优势:

  1. 内存安全:通过所有权系统、借用规则和生命周期,在编译时就能确保内存安全,无需垃圾回收器。
  2. 高性能:Rust的性能可以与C/C++相媲美,适用于对性能要求高的系统编程领域。
  3. 并发安全:Rust的所有权模型使得编写线程安全的并发代码变得简单,避免了数据竞争等常见问题。
  4. 零成本抽象:Rust提供了高级语言的抽象能力,但不会带来运行时性能损失。
  5. 优秀的工具链:Rust拥有强大的包管理器Cargo、自动格式化工具rustfmt、代码检查工具clippy等。
1.2 Rust语言的应用场景

Rust适用于以下场景:

  1. 系统编程:操作系统内核、设备驱动程序、嵌入式系统等。
  2. Web开发:通过WebAssembly、Actix-web等框架进行高性能Web开发。
  3. 网络服务:高性能服务器、代理、网关等。
  4. 区块链开发:如Solana、Polkadot等区块链项目。
  5. 游戏开发:游戏引擎、高性能游戏逻辑等。
  6. DevOps工具:如Docker、Kubernetes的某些组件等。
1.3 安装Rust

在开始学习Rust之前,我们需要先搭建Rust语言的开发环境。安装Rust的推荐方式是使用rustup工具,它是Rust的版本管理器和安装器。

1.3.1 Windows系统安装

对于Windows系统,我们可以按照以下步骤安装Rust:

访问Rust官网(https://www.rust-lang.org/)或直接访问rustup安装页面(https://rustup.rs/)。

点击"Download rustup-init.exe"按钮下载安装程序。

运行下载的安装程序,按照提示进行安装。安装过程中,会自动安装Rust编译器(rustc)、Rust标准库、Cargo包管理器等。

安装完成后,打开命令提示符(cmd)或PowerShell,输入以下命令验证安装是否成功:

代码语言:javascript
复制
rustc --version
cargo --version

如果显示Rust和Cargo的版本信息,说明安装成功。

1.3.2 macOS和Linux系统安装

对于macOS和Linux系统,我们可以按照以下步骤安装Rust:

打开终端。

输入以下命令下载并运行rustup安装脚本:

代码语言:javascript
复制
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

按照提示进行安装。安装过程中,会自动安装Rust编译器(rustc)、Rust标准库、Cargo包管理器等。

安装完成后,关闭并重新打开终端,输入以下命令验证安装是否成功:

代码语言:javascript
复制
rustc --version
cargo --version

如果显示Rust和Cargo的版本信息,说明安装成功。

2. 开发工具配置

选择一个合适的开发工具可以大大提高我们的开发效率。Rust语言支持多种集成开发环境(IDE)和文本编辑器,下面介绍几种常用的开发工具。

2.1 Visual Studio Code

Visual Studio Code(简称VS Code)是一个轻量级但功能强大的代码编辑器,通过安装Rust相关插件,可以提供良好的Rust开发体验。

推荐安装的插件:

  1. rust-analyzer:提供代码补全、错误检查、跳转定义等功能,是Rust开发中最常用的插件。
  2. CodeLLDB:用于Rust程序的调试。
  3. Rustfmt:自动格式化Rust代码。
  4. Even Better TOML:提供TOML文件(Cargo配置文件格式)的语法高亮和自动补全。
2.2 IntelliJ IDEA + Rust插件

IntelliJ IDEA是一款功能强大的IDE,通过安装Rust插件,可以支持Rust语言的开发。IntelliJ IDEA的Rust插件提供了代码补全、重构、调试等功能,适合喜欢全功能IDE的开发者。

2.3 Sublime Text + Rust Enhanced

Sublime Text是一款轻量级的文本编辑器,通过安装Rust Enhanced插件,可以提供Rust语言的语法高亮、代码补全等功能。

2.4 Vim/Emacs + Rust插件

对于喜欢使用Vim或Emacs的开发者,也可以通过安装相应的Rust插件来支持Rust开发。

3. Rust基础语法

3.1 第一个Rust程序

让我们从经典的"Hello, World!"程序开始,来了解Rust的基础语法:

代码语言:javascript
复制
fn main() {
    println!("Hello, World!");
}

这个程序非常简单,它定义了一个名为main的函数,这是Rust程序的入口点。函数体内只有一行代码,使用println!宏来打印"Hello, World!"。

我们可以使用以下步骤来编译和运行这个程序:

  1. 将上面的代码保存为main.rs文件。
  2. 打开终端,导航到保存文件的目录。
  3. 使用rustc main.rs命令编译程序,生成可执行文件。
  4. 运行生成的可执行文件:在Windows上运行main.exe,在macOS和Linux上运行./main
  5. 你应该会看到输出"Hello, World!"。
3.2 使用Cargo创建项目

Cargo是Rust的包管理器和构建工具,它可以帮助我们管理依赖、构建项目、运行测试等。使用Cargo创建和管理Rust项目是推荐的做法。

以下是使用Cargo创建和运行Rust项目的步骤:

打开终端,输入以下命令创建一个新的Rust项目:

代码语言:javascript
复制
cargo new hello_world

这个命令会创建一个名为hello_world的目录,并在其中初始化一个新的Rust项目。

导航到新创建的项目目录:

代码语言:javascript
复制
cd hello_world

查看项目结构,你会看到以下文件和目录:

  • Cargo.toml:项目配置文件,包含项目名称、版本、依赖等信息。
  • src/main.rs:项目的主源文件,包含程序入口点。

使用以下命令构建和运行项目:

代码语言:javascript
复制
cargo run

这个命令会编译项目并运行生成的可执行文件,输出"Hello, World!"。

3.3 注释

注释是代码中用于解释和说明的文本,不会被编译器执行。Rust支持两种类型的注释:

单行注释:以//开头,注释内容到行尾结束。

代码语言:javascript
复制
// 这是一个单行注释
let x = 5; // 这也是一个单行注释

多行注释:以/*开头,以*/结尾,可以跨越多行。

代码语言:javascript
复制
/*
 * 这是一个多行注释
 * 可以跨越多行
 */

4. 变量定义与使用

变量是编程中用于存储数据的容器。在Rust中,变量的定义和使用有一些特殊的规则和特性。

4.1 变量声明

在Rust中,我们使用let关键字来声明变量:

代码语言:javascript
复制
let x = 5;

这行代码声明了一个名为x的变量,并将其初始化为值5。Rust编译器会根据初始值自动推断变量的类型(在这个例子中,x的类型是i32,即32位整数)。

我们也可以显式地指定变量的类型:

代码语言:javascript
复制
let x: i32 = 5;
4.2 变量的可变性

在Rust中,变量默认是不可变的(immutable),这意味着一旦变量被赋值,就不能再改变它的值。这是Rust语言安全性的一个重要特性,可以防止意外修改变量值导致的错误。

如果我们想要声明一个可变的变量,需要使用mut关键字:

代码语言:javascript
复制
let mut x = 5;
println!("x = {}", x); // 输出: x = 5
x = 10;
println!("x = {}", x); // 输出: x = 10

在这个例子中,我们声明了一个可变的变量x,初始值为5,然后将其修改为10

4.3 变量隐藏

在Rust中,我们可以在同一个作用域内声明一个与已存在变量同名的新变量,这被称为变量隐藏(Variable Shadowing)。新变量会隐藏旧变量,使旧变量在后续的代码中不可见:

代码语言:javascript
复制
let x = 5;
println!("x = {}", x); // 输出: x = 5

let x = x + 1; // 隐藏旧的x,创建一个新的x
println!("x = {}", x); // 输出: x = 6

let x = "hello"; // 再次隐藏x,类型可以不同
println!("x = {}", x); // 输出: x = hello

变量隐藏与可变变量的区别在于:变量隐藏创建了一个新的变量,我们可以改变变量的类型,而可变变量只能修改其值,不能改变其类型。

4.4 常量

常量(Constants)是绑定到一个名称且不允许改变的值。与不可变变量不同,常量:

  1. 必须使用const关键字而不是let来声明。
  2. 必须显式地指定类型。
  3. 可以在任何作用域内声明,包括全局作用域。
  4. 只能被设置为常量表达式,不能是函数调用的结果或其他在运行时计算的值。

常量的声明语法如下:

代码语言:javascript
复制
const MAX_POINTS: u32 = 100_000;

注意,我们在数字字面量中使用了下划线_作为千位分隔符,这只是为了提高可读性,对值没有影响。

5. 数据类型详解

Rust是一门静态类型语言,这意味着编译器在编译时需要知道所有变量的类型。虽然Rust可以通过类型推断来确定变量的类型,但在某些情况下,我们仍然需要显式地指定类型。

Rust的基本数据类型可以分为两大类:标量类型(Scalar Types)和复合类型(Compound Types)。

5.1 标量类型

标量类型表示单个值,Rust有四种基本的标量类型:整数、浮点数、布尔值和字符。

5.1.1 整数类型

整数类型表示没有小数部分的数字。Rust提供了多种整数类型,它们的区别在于位宽度和是否有符号:

长度

有符号

无符号

8位

i8

u8

16位

i16

u16

32位

i32

u32

64位

i64

u64

128位

i128

u128

平台相关

isize

usize

其中,isizeusize类型的位宽度取决于程序运行的平台:在64位平台上是64位,在32位平台上是32位。这两种类型主要用于索引集合。

整数可以使用多种表示方式:

代码语言:javascript
复制
let decimal = 98_222; // 十进制
let hex = 0xff; // 十六进制
let octal = 0o77; // 八进制
let binary = 0b1111_0000; // 二进制
let byte = b'A'; // 字节字面量(仅适用于u8)
5.1.2 整数溢出

在Rust中,如果我们尝试存储一个超出整数类型范围的值,在调试模式下编译时会导致程序崩溃(panic),而在发布模式下编译时会发生整数溢出(integer overflow),导致值环绕(wrap around)。

为了避免整数溢出问题,Rust提供了几种处理方式:

  1. 使用checked_*方法:如果操作会导致溢出,返回None
  2. 使用wrapping_*方法:即使发生溢出,也会执行环绕行为。
  3. 使用overflowing_*方法:返回操作的结果和一个表示是否发生溢出的布尔值。
  4. 使用saturating_*方法:在溢出时,将值限制在类型的最大值或最小值。
5.1.3 浮点数类型

浮点数类型表示有小数部分的数字。Rust有两种浮点数类型:f32(单精度浮点数,32位)和f64(双精度浮点数,64位)。f64是默认的浮点数类型,它的精度更高,在大多数情况下性能也更好。

代码语言:javascript
复制
let x = 2.0; // f64
let y: f32 = 3.0; // f32

浮点数遵循IEEE-754标准,具有特殊的值如NaN(不是一个数)、infinity(无穷大)和-infinity(负无穷大)。

5.1.4 布尔值类型

布尔值类型表示真或假,Rust的布尔值类型为bool,只有两个可能的值:truefalse。布尔值在条件表达式和逻辑运算中非常有用。

代码语言:javascript
复制
let t = true;
let f: bool = false;
5.1.5 字符类型

字符类型(char)表示单个Unicode字符,在Rust中用单引号'括起来。Rust的字符类型占4个字节,可以表示Unicode标量值,范围从U+0000U+D7FFU+E000U+10FFFF

代码语言:javascript
复制
let c = 'z';
let z: char = 'ℤ'; // 注意这里使用的是单引号
let heart_eyed_cat = '😻';
5.2 复合类型

复合类型可以将多个值组合成一个类型。Rust有两种基本的复合类型:元组(Tuple)和数组(Array)。

5.2.1 元组

元组是将多个不同类型的值组合成一个复合类型的方式。元组的长度是固定的,一旦声明就不能改变。

代码语言:javascript
复制
let tup: (i32, f64, u8) = (500, 6.4, 1);

我们可以使用模式匹配或索引来访问元组中的元素:

代码语言:javascript
复制
// 使用模式匹配解构元组
let (x, y, z) = tup;
println!("The value of y is: {}", y); // 输出: The value of y is: 6.4

// 使用索引访问元组元素
let five_hundred = tup.0;
let six_point_four = tup.1;
let one = tup.2;

元组可以包含任何类型的值,甚至可以是空元组(),它表示一个没有值的类型,也被称为"单元类型"。

5.2.2 数组

数组是将多个相同类型的值组合成一个复合类型的方式。与元组不同,数组中的所有元素必须是相同类型的。此外,数组的长度是固定的,一旦声明就不能改变。

代码语言:javascript
复制
let a = [1, 2, 3, 4, 5];
let b: [i32; 5] = [1, 2, 3, 4, 5];

在第二个例子中,我们显式地指定了数组的类型为[i32; 5],表示这是一个包含5个i32类型元素的数组。

如果数组中的所有元素都具有相同的值,我们可以使用以下语法来初始化数组:

代码语言:javascript
复制
let c = [3; 5]; // 等同于 [3, 3, 3, 3, 3]

我们可以使用索引来访问数组中的元素:

代码语言:javascript
复制
let first = a[0];
let second = a[1];

需要注意的是,在Rust中,如果我们尝试访问超出数组范围的索引,程序会在运行时崩溃(panic),这是Rust安全性的一个体现,可以防止缓冲区溢出等常见的安全问题。

6. 所有权系统

所有权系统(Ownership System)是Rust语言最独特的特性之一,它使Rust无需垃圾回收器就能保证内存安全。所有权系统有一组规则,编译器会在编译时检查这些规则。如果违反了这些规则,程序将无法编译。

6.1 所有权的规则

Rust的所有权系统有以下三条规则:

  1. 每个值在Rust中都有一个被称为其"所有者"的变量。
  2. 同一时间只能有一个所有者。
  3. 当所有者超出作用域时,该值将被丢弃。
6.2 变量作用域

作用域是一个变量在程序中有效的范围。让我们看一个简单的例子:

代码语言:javascript
复制
{                      // s 在这里还没有被声明
    let s = "hello";   // s 在这里开始有效
    // 使用 s
}                      // 作用域结束,s 不再有效,内存被释放

当一个变量超出作用域时,Rust会调用一个特殊的函数drop来释放变量所占用的资源。这个函数是由编译器自动插入的。

6.3 String类型

为了理解所有权系统,让我们看一个更复杂的例子。我们将使用String类型,而不是前面使用的字符串字面量。String类型是一个在堆上分配内存的可变、可增长的字符串类型。

代码语言:javascript
复制
let s = String::from("hello"); // 在堆上分配内存

String::from函数在堆上分配内存来存储字符串"hello",并将返回的String实例赋值给变量s

6.4 移动

在Rust中,当我们将一个值赋给另一个变量时,所有权会发生转移,这被称为"移动"(Move)。让我们看一个例子:

代码语言:javascript
复制
let s1 = String::from("hello");
let s2 = s1; // s1 的所有权移动给了 s2

println!("{}, world!", s1); // 错误:s1 不再有效

在这个例子中,当我们将s1赋值给s2时,s1的所有权被移动给了s2s1不再有效。这是因为Rust避免了在堆上进行深拷贝(deep copy),以提高性能。如果我们真的想要创建一个String的深拷贝,可以使用clone方法:

代码语言:javascript
复制
let s1 = String::from("hello");
let s2 = s1.clone(); // 创建 s1 的深拷贝

println!("s1 = {}, s2 = {}", s1, s2); // 正确:s1 和 s2 都有效
6.5 复制

对于一些基本类型,如整数、浮点数、布尔值、字符和元组(如果元组中的所有元素都实现了Copy trait),Rust会执行复制(Copy)操作,而不是移动操作。这是因为这些类型的值在栈上存储,复制它们的成本很低。

代码语言:javascript
复制
let x = 5;
let y = x; // x 被复制给 y,x 仍然有效

println!("x = {}, y = {}", x, y); // 正确:x 和 y 都有效

一个类型是否实现了Copy trait是由开发者决定的。一般来说,如果一个类型实现了Drop trait,它就不应该实现Copy trait。

6.6 借用

在很多情况下,我们并不需要获取值的所有权,而只需要临时访问它。Rust提供了借用(Borrowing)机制,允许我们通过引用(Reference)来访问值而不获取其所有权。

引用的符号是&,我们可以通过引用传递值:

代码语言:javascript
复制
fn main() {
    let s1 = String::from("hello");
    let len = calculate_length(&s1); // 传递 s1 的引用
    
    println!("The length of '{}' is {}.", s1, len);
}

fn calculate_length(s: &String) -> usize { // 函数参数是引用类型
    s.len()
}

在这个例子中,我们将s1的引用传递给了calculate_length函数,而不是传递s1本身。这意味着s1的所有权仍然属于main函数,当calculate_length函数执行完毕后,s的引用会超出作用域,但不会影响s1

6.7 可变引用

默认情况下,引用是不可变的(immutable),这意味着我们不能通过引用修改引用的值。如果我们想要修改引用的值,需要使用可变引用(Mutable Reference):

代码语言:javascript
复制
fn main() {
    let mut s = String::from("hello");
    change(&mut s); // 传递 s 的可变引用
}

fn change(some_string: &mut String) { // 函数参数是可变引用类型
    some_string.push_str(", world!");
}

需要注意的是,可变引用有一个重要的限制:在同一个作用域内,我们只能有一个可变引用指向同一个值。这个限制可以防止数据竞争(Data Race),提高程序的安全性。

代码语言:javascript
复制
let mut s = String::from("hello");

let r1 = &mut s;
let r2 = &mut s; // 错误:在同一个作用域内不能有多个可变引用

println!("{}, {}", r1, r2);

不过,我们可以通过创建新的作用域来允许有多个可变引用,只要它们不在同一时间活跃:

代码语言:javascript
复制
let mut s = String::from("hello");

{
    let r1 = &mut s;
    println!("r1: {}", r1);
}

let r2 = &mut s;
println!("r2: {}", r2);
6.8 悬垂引用

悬垂引用(Dangling Reference)是指引用了已经被释放的内存的引用。在许多编程语言中,悬垂引用是一个常见的问题,可能导致程序崩溃或安全漏洞。在Rust中,编译器会在编译时就防止悬垂引用的出现。

代码语言:javascript
复制
fn dangle() -> &String { // 错误:返回了一个悬垂引用
    let s = String::from("hello");
    &s // 返回 s 的引用,但 s 在函数结束时就会被释放
}

在这个例子中,sdangle函数结束时就会被释放,所以返回的引用将指向一个不存在的内存位置。Rust编译器会检测到这个问题并拒绝编译这段代码。

6.9 生命周期

生命周期(Lifetime)是Rust中的一个概念,用于确保引用在其引用的值被释放之前不会变得无效。生命周期注解是一种标记引用存活时间的方式。

在大多数情况下,Rust编译器可以通过生命周期省略规则(Lifetime Elision Rules)自动推断生命周期,不需要我们显式地添加生命周期注解。但在某些复杂的情况下,我们需要显式地添加生命周期注解。

生命周期注解使用撇号(')开头,后面跟着一个名称(通常是一个小写字母),如'a'b等。

代码语言:javascript
复制
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { // 显式添加生命周期注解
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

在这个例子中,我们为longest函数添加了生命周期注解'a,表示函数的返回值的生命周期与参数xy中较短的那个相同。

7. 实战练习与常见问题

7.1 实战练习
  1. 创建一个新的Rust项目,打印出你的名字和年龄。
  2. 声明一个不可变变量和一个可变变量,修改变量的值并打印出来。
  3. 尝试变量隐藏,创建一个与已存在变量同名的新变量,并改变其类型。
  4. 声明并初始化不同类型的数组,尝试访问数组元素。
  5. 编写一个函数,接受一个字符串的引用,并返回该字符串的长度。
  6. 编写一个函数,接受一个可变字符串的引用,并向其追加一些内容。
7.2 常见问题
  1. 为什么Rust的变量默认是不可变的?
    • Rust的这种设计是为了提高代码的安全性和可维护性。默认不可变的变量可以防止意外修改变量值导致的错误。如果我们确实需要修改变量的值,可以显式地使用mut关键字。
  2. 什么是所有权?为什么Rust需要所有权系统?
    • 所有权是Rust中每个值都有一个被称为其"所有者"的变量的概念。所有权系统是Rust无需垃圾回收器就能保证内存安全的关键机制。它通过一组规则,在编译时就检查内存使用情况,避免了内存泄漏、空指针解引用等常见问题。
  3. 什么是借用和引用?它们与所有权有什么关系?
    • 借用是指通过引用临时访问值而不获取其所有权的机制。引用是一种特殊的指针类型,它允许我们访问值而不获取其所有权。借用和引用是所有权系统的重要组成部分,它们使我们能够在不转移所有权的情况下临时访问和操作值。
  4. 为什么可变引用有只能有一个的限制?
    • 这个限制是为了防止数据竞争(Data Race),提高程序的安全性。数据竞争是指当两个或多个指针同时访问同一个内存位置,且至少有一个指针正在写入,并且没有同步机制来协调这些访问时发生的情况。通过限制在同一个作用域内只能有一个可变引用指向同一个值,Rust可以在编译时就防止数据竞争的发生。
  5. 什么是生命周期?为什么需要生命周期注解?
    • 生命周期是指引用存活的时间范围。在某些复杂的情况下,编译器无法自动推断引用的生命周期,这时候就需要我们显式地添加生命周期注解,以确保引用在其引用的值被释放之前不会变得无效。

结语

通过本文的学习,我们已经掌握了Rust的环境搭建方法、基础语法知识、变量定义与使用、数据类型以及所有权系统等核心概念。这些知识是学习Rust高级特性和进行Rust应用开发的基础。

Rust的所有权系统可能需要一些时间来适应,但一旦掌握,它将成为你的得力助手,帮助你编写更加安全、高效的代码。在后续的文章中,我们将继续学习Rust的控制流、函数、结构体、枚举、模式匹配、集合类型、错误处理机制、模块化编程、泛型编程、闭包和迭代器以及并发编程等高级特性。

希望你在Rust的学习之旅中取得成功!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 目录
  • 1. Rust语言概述与环境搭建
    • 1.1 Rust语言的优势
    • 1.2 Rust语言的应用场景
    • 1.3 安装Rust
      • 1.3.1 Windows系统安装
      • 1.3.2 macOS和Linux系统安装
  • 2. 开发工具配置
    • 2.1 Visual Studio Code
    • 2.2 IntelliJ IDEA + Rust插件
    • 2.3 Sublime Text + Rust Enhanced
    • 2.4 Vim/Emacs + Rust插件
  • 3. Rust基础语法
    • 3.1 第一个Rust程序
    • 3.2 使用Cargo创建项目
    • 3.3 注释
  • 4. 变量定义与使用
    • 4.1 变量声明
    • 4.2 变量的可变性
    • 4.3 变量隐藏
    • 4.4 常量
  • 5. 数据类型详解
    • 5.1 标量类型
      • 5.1.1 整数类型
      • 5.1.2 整数溢出
      • 5.1.3 浮点数类型
      • 5.1.4 布尔值类型
      • 5.1.5 字符类型
    • 5.2 复合类型
      • 5.2.1 元组
      • 5.2.2 数组
  • 6. 所有权系统
    • 6.1 所有权的规则
    • 6.2 变量作用域
    • 6.3 String类型
    • 6.4 移动
    • 6.5 复制
    • 6.6 借用
    • 6.7 可变引用
    • 6.8 悬垂引用
    • 6.9 生命周期
  • 7. 实战练习与常见问题
    • 7.1 实战练习
    • 7.2 常见问题
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档