Rust 学习笔记

参考自Rust 程序设计语言 简体中文版

1. Hello world

Rust 学习笔记_第1张图片
Rust 学习笔记_第2张图片

2. Cargo(Rust 的构建系统和包管理器)

使用 Cargo 创建项目

Rust 学习笔记_第3张图片

Cargo 配置文件

Rust 学习笔记_第4张图片

Cargo 目录结构

Rust 学习笔记_第5张图片

构建并运行 Cargo 项目

Rust 学习笔记_第6张图片

发布(release)构建

Rust 学习笔记_第7张图片

Cargo 常用命令

  • cargo build:构建项目
  • cargo run:一步构建并运行项目
  • cargo check:在不生成二进制文件的情况下构建项目来检查错误(比 cargo run 快得多)

3. 【小项目】猜数游戏

原地址

准备一个新项目(工程目录)

Rust 学习笔记_第8张图片

使用 crate 来增加更多功能

Rust 学习笔记_第9张图片

Cargo.lock 文件确保构建是可重现的

Rust 学习笔记_第10张图片

更新 crate 到一个新版本

Rust 学习笔记_第11张图片

Code:猜数游戏

use std::io;
use std::cmp::Ordering;
use rand::Rng;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1..101);

    loop {
        println!("请输入一个数字");

        let mut guess = String::new();

        io::stdin()
            .read_line(&mut guess)
            .expect("Failed to get the number!");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("You guessed: {}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }
    }
}

4. Rust 基础

4.1 变量和可变性

Rust 学习笔记_第12张图片
Rust 学习笔记_第13张图片

常量

Rust 学习笔记_第14张图片

隐藏(Shadowing)

Rust 学习笔记_第15张图片

4.2 数据类型

Rust 必须指定数据类型

Rust 学习笔记_第16张图片

标量类型

  1. 整型
    Rust 学习笔记_第17张图片
    Rust 学习笔记_第18张图片

  2. 浮点型(整数除法为地板除)
    Rust 学习笔记_第19张图片

  3. 布尔型
    Rust 学习笔记_第20张图片

  4. 字符型(size为4个字节;字符单引号',字符串双引号"
    Rust 学习笔记_第21张图片

复合类型

  1. 元组
    Rust 学习笔记_第22张图片

  2. 数组
    Rust 学习笔记_第23张图片

4.3 函数

Rust 学习笔记_第24张图片

  1. 参数
    Rust 学习笔记_第25张图片

  2. 语句和表达式

    • 语句不返回值;而表达式会计算出一个值
    • 注意:表达式的结尾没有分号。如果在表达式的结尾加上分号,它就变成了语句,而语句不会返回值

Rust 学习笔记_第26张图片
Rust 学习笔记_第27张图片
3. 函数返回值
Rust 学习笔记_第28张图片

4.4 注释

  • //

4.5 控制流:if与循环

if 表达式

  1. 基础
    Rust 学习笔记_第29张图片
    Rust 学习笔记_第30张图片
    Rust 学习笔记_第31张图片
  2. 在 let 语句中使用 if
    Rust 学习笔记_第32张图片

loop 循环

  1. 基础
    Rust 学习笔记_第33张图片
  2. 带标签的 loop 循环
    • 用于在嵌套循环中 break 或 continue 指定循环

Rust 学习笔记_第34张图片
3. 从 loop 循环返回值
Rust 学习笔记_第35张图片

while 循环

Rust 学习笔记_第36张图片

for 循环(遍历集合)

Rust 学习笔记_第37张图片

5. 所有权

5.1 什么是所有权

栈(Stack)与堆(Heap)

Rust 学习笔记_第38张图片

所有权规则

Rust 学习笔记_第39张图片

变量作用域

Rust 学习笔记_第40张图片

String 类型

Rust 学习笔记_第41张图片

内存与分配

Rust 学习笔记_第42张图片

变量与数据交互的方式(一):移动(move,直接转移)

Rust 学习笔记_第43张图片
Rust 学习笔记_第44张图片
在这里插入图片描述

变量与数据交互的方式(二):克隆(clone,深复制)

Rust 学习笔记_第45张图片
Rust 学习笔记_第46张图片

只在栈上的数据:拷贝

Rust 学习笔记_第47张图片

所有权与函数

  • 向函数传递值可能会移动或者复制:对于实现 copy 的是复制,否则为转移

Rust 学习笔记_第48张图片

返回值与作用域

Rust 学习笔记_第49张图片

5.2 引用与借用

  • 在任意给定时间,下面情况只能存在一种:1、要么 只能有一个可变引用;2、要么 只能有多个不可变引用
  • 引用必须总是有效的(不能制造悬垂引用)

引用(&ref)

Rust 学习笔记_第50张图片
Rust 学习笔记_第51张图片
Rust 学习笔记_第52张图片

可变引用(&mut ref)

Rust 学习笔记_第53张图片
Rust 学习笔记_第54张图片
Rust 学习笔记_第55张图片

悬垂引用(Dangling References)

Rust 学习笔记_第56张图片
Rust 学习笔记_第57张图片

5.3 Slice 类型

引入

Rust 学习笔记_第58张图片
Rust 学习笔记_第59张图片

字符串 Slice

Rust 学习笔记_第60张图片
Rust 学习笔记_第61张图片
Rust 学习笔记_第62张图片

字符串字面值就是 slice(牢记此特性!)

Rust 学习笔记_第63张图片

字符串 slice 作为参数(而不是将 String 引用作为参数)

  • 传入 slice 作为参数:my_fn(&my_string[idx1..idx2])

Rust 学习笔记_第64张图片

其他类型的 slice

Rust 学习笔记_第65张图片
在这里插入图片描述

6. 结构体

6.1 结构体的定义和实例化

结构体定义、创建实例

Rust 学习笔记_第66张图片
Rust 学习笔记_第67张图片

创建实例:字段初始化简写语法

Rust 学习笔记_第68张图片

创建实例:结构体更新语法

  • 注意:结构体中的“移动”(用到了任意一个未实现 copy trait类型的数据)与“克隆”(只使用了实现 copy trait类型的数据)特性!!!
    Rust 学习笔记_第69张图片

元组结构体

Rust 学习笔记_第70张图片

类单元结构体

在这里插入图片描述

结构体数据的所有权

Rust 学习笔记_第71张图片

6.2 结构体示例程序(打印结构体的内容,dbg)

示例:打印矩形的面积

Rust 学习笔记_第72张图片

通过派生 trait 来打印结构体的内容

Rust 学习笔记_第73张图片
Rust 学习笔记_第74张图片
Rust 学习笔记_第75张图片

6.3 方法(method)

在这里插入图片描述

6.3.1 定义方法

Rust 学习笔记_第76张图片

6.3.2 与结构体字段同名的方法

  • 读取:&self
  • 修改:&mut self
  • 获取所有权:self

Rust 学习笔记_第77张图片

6.3.3 带有多个参数的方法

Rust 学习笔记_第78张图片

6.3.4 多个 impl 块

Rust 学习笔记_第79张图片

6.3.5 关联函数

  • 应用:(不是方法的)关联函数经常被用作返回一个结构体新实例的构造函数,这些函数的名称通常为 new
  • 举例:在 String 类型上定义的 String::from 函数

Rust 学习笔记_第80张图片

6.4 小结

Rust 学习笔记_第81张图片

7. 枚举和模式匹配

7.1 枚举的定义

7.1.1 基本概念

Rust 学习笔记_第82张图片
Rust 学习笔记_第83张图片

7.1.2 枚举的简洁用法:构造函数

Rust 学习笔记_第84张图片

7.1.3 枚举的优势:处理不同类型和数量的数据

  • 枚举成员的类型:字符串数字类型结构体枚举
  • 注意:在未将标准库枚举引入当前作用域中时,可以创建与标准库中同名的枚举!

Rust 学习笔记_第85张图片
Rust 学习笔记_第86张图片

7.1.4 在枚举中定义方法

Rust 学习笔记_第87张图片

7.2 Option 枚举

Rust 学习笔记_第88张图片

你可能感兴趣的:(Rust,rust,学习,开发语言)