rust代码学习笔记(未完待续11/1)

文章目录

    • 一、案例一:读取输入打印出来
    • 二、案例二:(引入新包)猜数字游戏
    • 三、案例三:循环猜测数字
    • 四、案例四:猜字游戏(彩色版本)
    • 五、rust一些注意事项
      • 1)声明变量默认是不可修改的
      • 2)const定义常量,且必须加类型标注
      • 3)标量(scalar)和复合类型(compound)数据类型
    • 六、函数
    • 七、控制流程(if、else语句和while语句、for循环)
    • 八、rustlings训练笔记(exercise目录)
      • 1)关于vscode的额外添加json配置
      • 2)修正错误
        • (1)println缺少`{}`的参数
        • (2)缺少let声明关键字
        • (3)变量得加上mut才能赋值
        • (4)x没有初始化赋值
        • (5)number一开始声明为字符串,得重新声明为整型
        • (6)声明常量必须给出类型声明,下面的NUMBER没有类型
        • (7)函数不用前向声明
        • (8)函数传参类型需要标注
        • (9)函数缺少返回值类型:
        • (10)返回有分号要去掉,否则返回的是void类型
        • (11)被move的vec不能再调用了
        • (12)不能对变量做两个可变引用
    • 九、rust三种常用内存管理方式
      • 1)赋值构造string(不是浅拷贝,是move操作)
      • 2)字符串作为函数参数传入就会被move
      • 3)对于整型变量是copy而不是move
      • 4)利用引用解决字符串被move的问题
      • 5)不能对同一变量同时做两次可变引用(防止数据竞争Data Race)
      • 6)变量若有不可变引用,就不能创建可变引用
      • 7)生命周期结束的字符串不要取引用出来(数据得是有效的)
      • 8)切片不会获取数据的所有权
    • 十、结构体
      • 1)结构体简单构造
      • 2)元组结构体(没有字段名的结构体)
      • 3)debug模式下输出打印信息
      • 4)结构体里面附加函数area()
      • 5)实例方法(必须传入自身)和关联函数
      • 6)结构体部分的exercise习题总结
        • (1)实例化一个unit的结构体
        • (2)拷贝旧结构体,新增字段
        • (3)若参数错误则输出panic语句
    • 十一、枚举和模式匹配
      • 1)枚举添加各种类型的值和取值
      • 2)枚举匹配返回不同值
      • 3)Option表示可选,可传值也可以不传
      • 4)枚举和模式匹配相关exercise习题
    • 十二、包和模块系统
      • 1)package包和crate的规则
      • 2)模块modules讲解
        • (1)创建一个resturante的包,想要包中有一个库形式的crate
        • (2)创建父模块和子模块、公共函数调用模块函数方法发
        • (3)模块函数、enum、struct可见性问题及解决方法
        • (4)use简化引用路径
        • (5)若mod有冲突
        • (6)如何外部也能引用到hosting模块(加入pub关键字)
        • (7)如何引入外部包
        • (8)将模块定义移动到其他模块中去
    • 十三、常见集合(集合类型实例在堆上面)
      • 1)动态数组vector
        • (1)定义数组
        • (2)取值操作
        • (3)遍历vec数组
      • 2)utf-8编码文本(字符串,四种方法)
      • 3)哈希map中存储键和关联值
    • 十四、错误处理
      • 1)panic函数
      • 2)可恢复错误处理
      • 3)错误传播(error propagation)(略)
      • 4)panic还是result?
    • 十五、泛型、特征(trait)及生存期(略)

一、案例一:读取输入打印出来

fn main() {
    println!("Hello, world!");
    let mut guess = String::new();
    io::stdin().read_line(&mut guess).expect("error");

    println!("你打印的数字是  {}",guess);
}

二、案例二:(引入新包)猜数字游戏

cargo build 安装新包

①引入随机数包
rust代码学习笔记(未完待续11/1)_第1张图片
②引入随机库
③源码

use std::io; //需要引入库
use rand::Rng;
use std::cmp::Ordering;

fn main() {

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

    println!("请输入你的猜测数字!");

    let mut guess = String::new();
    io::stdin().read_line(&mut guess).expect("error");
    let guess:i32 = guess.trim().parse().expect("请输出数字");

    match guess.cmp(&secret_num){
        Ordering::Less     =>println!("猜小了"),
        Ordering::Greater  =>println!("猜大了"),
        Ordering::Equal    =>println!("猜对了"),
    }

    println!("你输入的数字是  {}",guess);
    print!("秘密数字是:{}",secret_num);
}

三、案例三:循环猜测数字

use std::io; //需要引入库
use rand::Rng;
use std::cmp::Ordering;

fn main() {

    let secret_num=rand::thread_rng().gen_range(1..101);
    loop {
        println!("请输入你的猜测数字!");

        let mut guess = String::new();
        io::stdin().read_line(&mut guess).expect("error");
        let guess:i32 = match guess.trim().parse(){
            Ok(num)  =>num,
            Err(_)       =>continue,
        };
    
        match guess.cmp(&secret_num){
            Ordering::Less     =>println!("猜小了"),
            Ordering::Greater  =>println!("猜大了"),
            Ordering::Equal    =>{
                println!("猜对了");
                break;
            },
        }
    
        println!("你输入的数字是  {}",guess);
        print!("秘密数字是:{}",secret_num);
    }
}

四、案例四:猜字游戏(彩色版本)

use std::io; //需要引入库
use rand::Rng;
use std::cmp::Ordering;
use colored::*;

fn main() {

    let secret_num=rand::thread_rng().gen_range(1..101);
    loop {
        println!("请输入你的猜测数字!");

        let mut guess = String::new();
        io::stdin().read_line(&mut guess).expect("error");
        let guess:i32 = match guess.trim().parse(){
            Ok(num)  =>num,
            Err(_)       =>continue,
        };
    
        match guess.cmp(&secret_num){
            Ordering::Less     =>println!("{}","太小了!".red()),
            Ordering::Greater  =>println!("{}","太大了!".red()),
            Ordering::Equal    =>{
                println!("{}","猜对了!".green());
                break;
            },
        }
    
        println!("你输入的数字是  {}",guess);
        print!("秘密数字是:{}",secret_num);
    }
}

五、rust一些注意事项

1)声明变量默认是不可修改的

rust代码学习笔记(未完待续11/1)_第2张图片
解决方法:(加mut关键词)
rust代码学习笔记(未完待续11/1)_第3张图片

2)const定义常量,且必须加类型标注

    const UC_NUM:u32 = 1000;

3)标量(scalar)和复合类型(compound)数据类型

①整数类型
rust代码学习笔记(未完待续11/1)_第4张图片
debug超出正常范围就会panicked,release模式下会超过最大值得数转回最小值

②字符类型
rust代码学习笔记(未完待续11/1)_第5张图片
③浮点数
rust代码学习笔记(未完待续11/1)_第6张图片
④复合类型tuple
rust代码学习笔记(未完待续11/1)_第7张图片
取元素方式:(tuple元素从0开始,如下所示)
①解构
②点标记

rust代码学习笔记(未完待续11/1)_第8张图片
⑤数组vector
下面byte数组表示初始化了8元素的数组,数组全为0
rust代码学习笔记(未完待续11/1)_第9张图片

六、函数

rust代码学习笔记(未完待续11/1)_第10张图片

rust代码学习笔记(未完待续11/1)_第11张图片

七、控制流程(if、else语句和while语句、for循环)

rust代码学习笔记(未完待续11/1)_第12张图片
用条件控制流程:
rust代码学习笔记(未完待续11/1)_第13张图片
while语句控制:
rust代码学习笔记(未完待续11/1)_第14张图片
for循环:
rust代码学习笔记(未完待续11/1)_第15张图片

rust代码学习笔记(未完待续11/1)_第16张图片
或(用范围循环):
rust代码学习笔记(未完待续11/1)_第17张图片

八、rustlings训练笔记(exercise目录)

安装步骤:
rust代码学习笔记(未完待续11/1)_第18张图片

或是手工去github上git clone 下来安装:
rust代码学习笔记(未完待续11/1)_第19张图片
命令:

rustlings watch //进入做题和批改模式

1)关于vscode的额外添加json配置

在这里插入图片描述

2)修正错误

(1)println缺少{}的参数

rust代码学习笔记(未完待续11/1)_第20张图片

(2)缺少let声明关键字

rust代码学习笔记(未完待续11/1)_第21张图片

(3)变量得加上mut才能赋值

rust代码学习笔记(未完待续11/1)_第22张图片

(4)x没有初始化赋值

rust代码学习笔记(未完待续11/1)_第23张图片
得改成:

let x:i32=6;
(5)number一开始声明为字符串,得重新声明为整型

rust代码学习笔记(未完待续11/1)_第24张图片

let number = 3;
(6)声明常量必须给出类型声明,下面的NUMBER没有类型

rust代码学习笔记(未完待续11/1)_第25张图片
改成:

const NUMBER:i32 = 3;
(7)函数不用前向声明

rust代码学习笔记(未完待续11/1)_第26张图片

(8)函数传参类型需要标注

rust代码学习笔记(未完待续11/1)_第27张图片

(9)函数缺少返回值类型:

rust代码学习笔记(未完待续11/1)_第28张图片
改成

fn sale_price(price:i32)->i32 {
	...
}
(10)返回有分号要去掉,否则返回的是void类型

解决方法:
①去分号
②加上return
rust代码学习笔记(未完待续11/1)_第29张图片

(11)被move的vec不能再调用了

rust代码学习笔记(未完待续11/1)_第30张图片
解决方法:
①再拷贝一份数据(to_vec方法)
rust代码学习笔记(未完待续11/1)_第31张图片
②传入引用数据,并且函数里面调用to_vec拷贝
rust代码学习笔记(未完待续11/1)_第32张图片
③对原数组操作(原数组改为mut)
rust代码学习笔记(未完待续11/1)_第33张图片

(12)不能对变量做两个可变引用

rust代码学习笔记(未完待续11/1)_第34张图片

解决方法:
区分开作用域范围(提前结束参数y作用域)
rust代码学习笔记(未完待续11/1)_第35张图片

九、rust三种常用内存管理方式

rust代码学习笔记(未完待续11/1)_第36张图片

1)赋值构造string(不是浅拷贝,是move操作)

rust代码学习笔记(未完待续11/1)_第37张图片

2)字符串作为函数参数传入就会被move

rust代码学习笔记(未完待续11/1)_第38张图片

可以试着这样做:
rust代码学习笔记(未完待续11/1)_第39张图片
或者返回出字符串:
rust代码学习笔记(未完待续11/1)_第40张图片

3)对于整型变量是copy而不是move

rust代码学习笔记(未完待续11/1)_第41张图片

4)利用引用解决字符串被move的问题

特点:允许使用,但是不获取所有权
rust代码学习笔记(未完待续11/1)_第42张图片
若要修改原变量的值,加上mut:
rust代码学习笔记(未完待续11/1)_第43张图片

5)不能对同一变量同时做两次可变引用(防止数据竞争Data Race)

rust代码学习笔记(未完待续11/1)_第44张图片

6)变量若有不可变引用,就不能创建可变引用

rust代码学习笔记(未完待续11/1)_第45张图片

除非不可变引用的作用域结束了:

rust代码学习笔记(未完待续11/1)_第46张图片

7)生命周期结束的字符串不要取引用出来(数据得是有效的)

rust代码学习笔记(未完待续11/1)_第47张图片

8)切片不会获取数据的所有权

获取切片示例:
rust代码学习笔记(未完待续11/1)_第48张图片

使用举例(返回去除字符串里面空格的单词):
rust代码学习笔记(未完待续11/1)_第49张图片

十、结构体

1)结构体简单构造

①初始化构建struct
rust代码学习笔记(未完待续11/1)_第50张图片
或写个类似构造函数的函数:
rust代码学习笔记(未完待续11/1)_第51张图片
rust代码学习笔记(未完待续11/1)_第52张图片
或赋值构造函数:
rust代码学习笔记(未完待续11/1)_第53张图片

2)元组结构体(没有字段名的结构体)

rust代码学习笔记(未完待续11/1)_第54张图片

使用例子:
rust代码学习笔记(未完待续11/1)_第55张图片
或者传入引用
rust代码学习笔记(未完待续11/1)_第56张图片

3)debug模式下输出打印信息

#[derive(Debug)]

①{:?}打印信息
rust代码学习笔记(未完待续11/1)_第57张图片

②{:#?}打印信息能打印更工整的信息

4)结构体里面附加函数area()

rust代码学习笔记(未完待续11/1)_第58张图片

rust代码学习笔记(未完待续11/1)_第59张图片

5)实例方法(必须传入自身)和关联函数

实力方法(必须传入自身结构体):
rust代码学习笔记(未完待续11/1)_第60张图片
关联函数:
rust代码学习笔记(未完待续11/1)_第61张图片
调用举例:
在这里插入图片描述

6)结构体部分的exercise习题总结

(1)实例化一个unit的结构体

rust代码学习笔记(未完待续11/1)_第62张图片

(2)拷贝旧结构体,新增字段

rust代码学习笔记(未完待续11/1)_第63张图片

(3)若参数错误则输出panic语句

rust代码学习笔记(未完待续11/1)_第64张图片

十一、枚举和模式匹配

示例:
rust代码学习笔记(未完待续11/1)_第65张图片
或者定义为字符串:
rust代码学习笔记(未完待续11/1)_第66张图片
或者不同类型枚举:
rust代码学习笔记(未完待续11/1)_第67张图片

1)枚举添加各种类型的值和取值

定义:
rust代码学习笔记(未完待续11/1)_第68张图片
取值相加:
rust代码学习笔记(未完待续11/1)_第69张图片

2)枚举匹配返回不同值

rust代码学习笔记(未完待续11/1)_第70张图片
rust代码学习笔记(未完待续11/1)_第71张图片
或可以循环嵌套枚举值:

rust代码学习笔记(未完待续11/1)_第72张图片
rust代码学习笔记(未完待续11/1)_第73张图片

3)Option表示可选,可传值也可以不传

rust代码学习笔记(未完待续11/1)_第74张图片
里面的plus_one函数表示传入none就返回none,传入整数就返回Some(原来的数加1)

额外举例说明(若match匹配到了some(3)就打印,没匹配到就什么也不做):

在这里插入图片描述

4)枚举和模式匹配相关exercise习题

打到和下图的结构体一样:
rust代码学习笔记(未完待续11/1)_第75张图片

编写对应的process函数:

rust代码学习笔记(未完待续11/1)_第76张图片

十二、包和模块系统

cargo new xxx可以创建一个xxx的包

1)package包和crate的规则

rust代码学习笔记(未完待续11/1)_第77张图片
举例说明:
①库形式的lib crate和二进制的mian crate
rust代码学习笔记(未完待续11/1)_第78张图片
②若需要更多的二进制crate
bin目录中的每一个二进制文件都对应一个crate
rust代码学习笔记(未完待续11/1)_第79张图片

2)模块modules讲解

(1)创建一个resturante的包,想要包中有一个库形式的crate
cargo new --lib resturante
(2)创建父模块和子模块、公共函数调用模块函数方法发

rust代码学习笔记(未完待续11/1)_第80张图片
注意:子模块可以看到父模块关键字,若想要父看到子,需要加公立pub
公共函数:
①绝对路径
②相对路径
rust代码学习笔记(未完待续11/1)_第81张图片

或另一种方法:(super可以访问父模块当中的函数server_order)

rust代码学习笔记(未完待续11/1)_第82张图片

(3)模块函数、enum、struct可见性问题及解决方法

问题解决举例:(不是公立pub的)
rust代码学习笔记(未完待续11/1)_第83张图片
修改为:

rust代码学习笔记(未完待续11/1)_第84张图片
若需要修改struct里面的个别字段,则可以修改为:
rust代码学习笔记(未完待续11/1)_第85张图片

举例枚举若不是pub的:
rust代码学习笔记(未完待续11/1)_第86张图片
修改后为
rust代码学习笔记(未完待续11/1)_第87张图片

(4)use简化引用路径

引用前:
rust代码学习笔记(未完待续11/1)_第88张图片

引用后:
rust代码学习笔记(未完待续11/1)_第89张图片

(5)若mod有冲突

①方法一:返回值不同
rust代码学习笔记(未完待续11/1)_第90张图片
②方法二:起别名
rust代码学习笔记(未完待续11/1)_第91张图片

(6)如何外部也能引用到hosting模块(加入pub关键字)

rust代码学习笔记(未完待续11/1)_第92张图片

(7)如何引入外部包

①修改cargo.html
rust代码学习笔记(未完待续11/1)_第93张图片
②引入rand到当前包当中
rust代码学习笔记(未完待续11/1)_第94张图片

若引入包很多,则可以像下图一样:
rust代码学习笔记(未完待续11/1)_第95张图片
在这里插入图片描述
这个可以简化为:(self为自身)

在这里插入图片描述
或:
在这里插入图片描述

(8)将模块定义移动到其他模块中去

原来的front_of_house模块:

rust代码学习笔记(未完待续11/1)_第96张图片
移动后:

rust代码学习笔记(未完待续11/1)_第97张图片

若还要挪动,则改为这样:
rust代码学习笔记(未完待续11/1)_第98张图片
rust代码学习笔记(未完待续11/1)_第99张图片

十三、常见集合(集合类型实例在堆上面)

1)动态数组vector

(1)定义数组
let a=[1,2,3];
let mut v:Vec<i32>=Vec::new();
let v2=vec![1,2,3];

rust代码学习笔记(未完待续11/1)_第100张图片

(2)取值操作

rust代码学习笔记(未完待续11/1)_第101张图片
匹配取值:
rust代码学习笔记(未完待续11/1)_第102张图片

(3)遍历vec数组

rust代码学习笔记(未完待续11/1)_第103张图片
若遍历来修改值,用*取得值:
rust代码学习笔记(未完待续11/1)_第104张图片
若vec存策划填表的数值:

rust代码学习笔记(未完待续11/1)_第105张图片
rust代码学习笔记(未完待续11/1)_第106张图片

2)utf-8编码文本(字符串,四种方法)

①初始化字符串
rust代码学习笔记(未完待续11/1)_第107张图片
②添加字符
rust代码学习笔记(未完待续11/1)_第108张图片

rust代码学习笔记(未完待续11/1)_第109张图片
但是字符串不能通过下标访问:

rust代码学习笔记(未完待续11/1)_第110张图片
打印阿斯克马和字符:
rust代码学习笔记(未完待续11/1)_第111张图片

3)哈希map中存储键和关联值

①首先引入键值对
在这里插入图片描述
②创建并插入hashmap
rust代码学习笔记(未完待续11/1)_第112张图片
③读取键值对数据

rust代码学习笔记(未完待续11/1)_第113张图片
④插入多对为赋值香锅

rust代码学习笔记(未完待续11/1)_第114张图片
entry为若有,则不插入,若无则插入,entry返回键值对
下面的例子(统计字符串中字母的频率):
rust代码学习笔记(未完待续11/1)_第115张图片

十四、错误处理

1)panic函数

①调用panic宏
rust代码学习笔记(未完待续11/1)_第116张图片
②panic能看到调用的崩溃堆栈
rust代码学习笔记(未完待续11/1)_第117张图片

2)可恢复错误处理

①先做个返回类型的枚举
rust代码学习笔记(未完待续11/1)_第118张图片
②根究返回值判断
rust代码学习笔记(未完待续11/1)_第119张图片
③引入ErrorKind对不同情况做分情况处理
(若打开失败则创建txt文件)
rust代码学习笔记(未完待续11/1)_第120张图片
或者这样写:
rust代码学习笔记(未完待续11/1)_第121张图片
或者:
rust代码学习笔记(未完待续11/1)_第122张图片

3)错误传播(error propagation)(略)

用处:让调用方来处理错误,更加灵活

4)panic还是result?

十五、泛型、特征(trait)及生存期(略)

rust代码学习笔记(未完待续11/1)_第123张图片

你可能感兴趣的:(rust,学习,笔记)