一、安装
通过 rustup 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具
1.1 在 Linux 上安装 rustup
$ curl https://sh.rustup.rs -sSf | sh
检查rustc安装版本
$ rustc --version
rustc 1.46.0 (04488afe3 2020-08-24)
1.2 使用cargo进行工程管理
cargo new hello —— 生成项目hello
cargo run
cargo build —— 编译
cargo check —— 语法检查
cargo run --release —— Rust代码测试性能用
二、通用编程概念
2.1 变量与常量
- 使用let可以声明推导类型变量(类似于auto)
- 变量默认是不可改变的(immutable)。声明的变量前面如果不加
mut
, 则该变量为不可变变量 - 后声明的同名变量会将之前声明的变量隐藏掉。
- 声明常量使用
const
关键字而不是let
,并且必须
注明值的类型
const MAX_POINT: u32 = 10000; // 常量
fn main() {
let a = 1; //不可变变量。
println!("a={}", a);
let mut b: u32 = 1; //加了mut之后,b变成了可变变量
println!("b={}", b);
b = 2;
println!("b={}", b);
let b = 1.1; //隐藏了前面定义的变量b
println!("b={}", b);
println!("MAX_POINT = {}", MAX_POINT);
}
2.2 数据类型
2.2.1 分类
基础数据类型
- bool
- char——32位
- 数字类型
- 自适应类型
- 元组
复合数据类型
- 结构体
- 枚举
字符串类型
2.2.2 例子
fn main() {
//bool
let is_true: bool = true;
println!("is_true = {}", is_true);
let is_false: bool = false;
println!("is_false = {}", is_false);
//char在rust中为32位。c++中卫8位。因此rust中,char可以是汉字
let b = '你';
println!("b = {}", b);
//数字类型:
//有符号8位置、16位、32位、64位;u8, u16, u32, u64, f32, f64
let c: i8 = -111;
println!("c={}", c);
let d:f32 = 0.0009;
println!("d={}", d);
//自适应类型isize,usize
println!("max = {}", usize::max_value());
println!("max = {}", isize::max_value());
//数组
//[type: size], size也是数组类型的一部分
let arr: [u32; 3] = [1, 2, 3];
show(arr);
//元组
let tup:(i32, f32, char) = (-1, 3.69, '好');
println!("{}", tup.0);
println!("{}", tup.1);
println!("{}", tup.2);
}
fn show(arr:[u32; 3]) {
println!("----------------");
for i in &arr {
println!("{}", i);
}
println!("----------------");
}
2.3 函数
fn
关键字用来声明新函数- Rust 代码中的函数和变量名使用
snake case 规范风格
。在 snake case 中,所有字母都是小写并使用下划线分隔单词
- 函数也可以被定义为拥有 参数(parameters),参数是特殊变量,是函数签名的一部分。
- 语句(Statements)是执行一些操作但不返回值的指令。
- 表达式(Expressions)计算并产生一个值
- 函数可以向调用它的代码返回值。我们并不对返回值命名,但要在箭头(
->
)后声明它的类型。
2.4 控制流
2.4.1 if
2.4.1.1 代码中的条件 必须 是 bool
值
fn main() {
let number = 3;
if number < 5 {
println!("condition was true");
} else {
println!("condition was false");
}
}
2.4.1.2 在 let 语句中使用 if
- let赋值时,if和else中的
类型必须一致
fn main() {
let condition = true;
let number = if condition {
5
} else {
6 //注意:let赋值时,if和else中的类型必须一致
};
println!("The value of number is: {}", number);
}
2.4.2 loop
- loop 关键字告诉 Rust 一遍又一遍地执行一段代码直到你明确要求停止。
fn main() {
loop {
println!("again!");
}
}
- 大部分终端都支持一个快捷键,ctrl-c,来终止一个陷入无限循环的程序
- 可以使用 break 关键字来告诉程序何时停止循环
2.4.3 while 条件循环
fn main() {
let a = [10, 20, 30, 40, 50];
let mut index = 0;
while index < 5 {
println!("the value is: {}", a[index]);
index = index + 1;
}
}
缺点:
数组中的所有五个元素都如期被打印出来。尽管 index 在某一时刻会到达值 5 ,不过循环在其尝试从数组获取第六个值(会越界)之前就停止了。
但这个过程很容易出错;如果索引长度不正确会导致程序 panic。这也使程序更慢,因为编译器增加了运行时代码来对每次循环的每个元素进行条件检查。
2.4.4 使用 for 遍历集合
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a.iter() {
println!("the value is: {}", element);
}
}
在示例 代码中,如果从数组 a 中移除一个元素但忘记将条件更新为 while index < 4 ,代码将会 panic。使用 for 循环的话,就不需要惦记着在改变数组元素个数时修改其他的代码了。
rev
,用来反转 range
fn main() {
for number in (1..4).rev() {
println!("{}!", number);
}
println!("LIFTOFF!!!");
}
三、所有权
所有权(系统)是 Rust 最独特的功能,其令 Rust 无需垃圾回收(garbage collector)即可保障内存安全。
所有运行的程序都必须管理其使用计算机内存的方式。
- 一些语言中具有垃圾回收机制,在程序运行时不断地寻找不再使用的内存;
- 在另一些语言中,程序员必须亲自分配和释放内存。
- Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。
在运行时,所有权系统的任何功能都不会减慢程序
。
3.1 所有权规则
- Rust 中的每一个值都有一个被称为其 所有者(owner)的变量。
- 值有且只有一个所有者。
- 当所有者(变量)离开作用域,这个值将被丢弃。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。