rust_learn
rust学习笔记
学习网站:
官方文档:Rust 程序设计语言 - Rust 程序设计语言 简体中文版 (kaisery.github.io),不是很推荐新手看,整个开头就直接写函数了,很多基础还要自己查。
rust圣经:关键字 - Rust语言圣经(Rust Course),推荐,讲得很不错
第一章:安装,基本命令和配置
vscode安装
安装基本工具:
安装 Rust - Rust 程序设计语言 (rust-lang.org)
选择1即可,按流程安装
ps:如果命令行 cargo 没有办法识别,配置系统的环境变量(不是用户环境变量),在path中添加
1 | C:\Users\[username].cargo\bin |
插件推荐:
1 | rust-analyzer |
编译
单个文件编译
1 | rustc [filename] |
项目建立
1 | cargo new [projectname] |
项目中src中的main.rs作为第一个运行的文件,其中的main函数作为第一个运行的函数
项目编译
1 | cargo check #速度更快,检查是否可以编译 |
配置
项目的根目录下面存在有cargo.toml
1 | [package] |
package是基本信息
dependencies是扩展包的信息
一般不含有扩展包,国内需要进行换源
window下路径为
1 | C:\Users\[username]\.cargo |
修改config,如果没有就建立一个,复制以下内容,更改为清华源
1 | [source.crates-io] |
第二章 基础学习
1. 变量
1 | let a; #不可变变量 |
2.关键字
不能够作为变量命名的关键字如下:
1 | 如下关键字目前有对应其描述的功能。 |
保留变量:
1 | 如下关键字没有任何功能,不过由 Rust 保留以备将来的应用。 |
但是可以通过前缀标识符来处理
-
Rust 中常用的标识符前缀: 1. r#:用于在标识符名称中使用保留关键字。例如,r#type 表示名称为 type 的标识符。 2. b:用于表示字节字符串(byte string)字面量,例如,b"hello" 表示字节字符串 hello。 3. r:用于表示 raw 字符串字面量,例如,r#"hello \n world"# 表示一个包含转义字符的 raw 字符串。 4. 0b、0o、0x:用于表示二进制、八进制和十六进制整数字面量,例如,0b101 表示二进制数 101。 除了以上常用的标识符前缀之外,Rust 还支持一些其他的标识符前缀,例如: - crate:用于表示当前 crate 的根模块,例如,crate::foo 表示当前 crate 中名为 foo 的模块。 - self:用于表示当前模块,例如,self::foo 表示当前模块中名为 foo 的标识符。 - super:用于表示当前模块的父模块,例如,super::foo 表示当前模块的父模块中名为 foo 的标识符。
1
2
3
4
5
6
7
## 3.变量类型以及绑定,解绑定义
### 整型
有符号类型:
i8, i16, i32, i64, i128
无符号类型:
u8, u16, u32, u64, u128
1 |
|
use std::mem::size_of_val;
fn main() {
let s:&str = “1”;
println!(“{}”, size_of_val(&s))
}
res: 16
1 |
|
rustCopy codefn print_hello() -> () {
println!(“Hello, world!”);
}
1 |
|
rustCopy codefn do_something(_: ()) {
println!(“I’m doing something!”);
}
1 |
|
let empty_tuple: () = ();
1 |
|
rustCopy code
let x = 1 + (2 * ());
1 |
|
struct Struct {
e: i32
}
fn main() {
let (a, b, c, d, e);
(a, b) = (1, 2);
// _ 代表匹配一个值,但是我们不关心具体的值是什么,因此没有使用一个变量名而是使用了 _
[c, .., d, _] = [1, 2, 3, 4, 5];
Struct { e } = Struct { e: 5 };
assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
}
1 |
… 表示匹配一个序列中的所有剩余元素,例如 let [a, b, …] = [1, 2, 3, 4, 5] 将会把 a 和 b 分别赋值为 1 和 2,而剩余的元素 [3, 4, 5] 则会被忽略。
_ 被称为通配符(wildcard),它可以匹配任何类型的值,并且不会将匹配到的值绑定到任何变量上。因此,通配符 _ 可以用于丢弃不需要的值。
name @ pattern 表示将匹配到的值绑定到一个变量上,并且同时匹配一个模式。例如,match Some(42) { Some(n @ 1…=100) => println!(“Got a number between 1 and 100: {}”, n), _ => () } 表示如果匹配到的是 Some 枚举的值,并且这个值在 1 到 100 的范围内,则将其赋值给变量 n,并打印一条信息。在一个 match 表达式中,_ 可以被用作最后一个分支的模式,它可以匹配所有未被之前分支匹配到的情况。这个分支通常被称为“捕获所有”分支(catch-all branch)或者“默认”分支(default branch)。通常,当我们不需要对某个分支进行处理时,可以使用“捕获所有”分支来忽略它。
1 |
|
fn main() {
let x = 5;
// 在main函数的作用域内对之前的x进行遮蔽
let x = x + 1;
{
// 在当前的花括号作用域内,对之前的x进行遮蔽
let x = x * 2;
println!("The value of x in the inner scope is: {}", x);
}
println!("The value of x is: {}", x);
}