变量和不可变性
变量
声明变量的方式
let
: 变量,在栈上分配一个变量, 如果一个变量是可变的,那么我们需要用mut
来显示的声明let mut a = 1
const
: 常量,常量是一个右值,不能被修改。常量编译后被放入可执行文件的数据段,全局可访问static
: 静态变量,静态变量和常量一样全局客服昂文,他也被编入可执行文件的数据段中。静态变量可以使声明为可变(mut
)
函数
函数的声明方式:
fn name(params1: T1,...) -> T {
// TODO
}
- 函数的类型和返回值必须要显示定义。如果没有返回值就可以省略,返回值默认为
unit
- 函数内部如果需要提前返回,需要用
return
关键字,否则最后一个表达式就是其返回值 - 如果最后一个表达式后面添加了
;
分号,隐含其返回值为unit
(即没有返回值)
fn pi()-> f64 {
3.1415926
}
// 加了分号证明隐式返回值为unit
fn not_pi() {
3.1415926;
}
fn main(){
let is_pi = pi();
let is_unit1 = not_pi();
let is_unit2 = {
pi()
};
println!("is_pi:{:?}, is_unit1:{:?}, is_unit2:{:?}", is_pi,is_unit1,is_unit2); // is_pi:3.1415926, is_unit1:(), is_unit2:3.1415926
}
数据结构
- 枚举
枚举有两种形式:
- 标签联合。 enum可以承载多个不同的数据结构中的一种
#[derive(Debug)]
enum Option {
Some(T),
None,
}
- 枚举
#[derive(Debug)]
enum Gender {
Unspecified = 0,
Female = 1,
Male = 2,
}
- struct
标准结构体,可以把任何类型组合在结构体里使用
结构体有三种形式:
- 空结构体,不占任何内存空间
struct Marker;
(有啥用?) - 元组结构体,struct的每个域都是匿名的,可以通过索引访问
#[derive(Debug)]
struct Color(u8,u8,u8)
- 普通结构体,struct的每个域都有名字,可以通过名称访问
#[derive(Debug)]
struct User {
id: UserId,
name: String,
gender: Gender,
}
- 元组结构体
struct
的特殊形式,称为元组结构体。
他的域都是匿名的,可以用索引访问,适用于简单的结构体
#[derive(Debug, Copy, Clone)]
struct UserId(u64);
- 修饰
为数据结构引入一些额外的行为,在rust里通过trait
来定义。
Rust为我们提供了派生宏,用来键位一些标准接口的定义。
#[derive(Debug)]
上面的示例代码就位数据结构实现了 [debug trait](https://doc.rust-lang.org/std/fmt/trait.Debug.html)
,这样就可以通过 {:?}
,用 println!
打印出来
控制流程
Rust
的流程控制和我们在JS中使用的大致相同,循环也可以通过 break
提前终止,也可以通过 continue
来跳到下一轮循环
- 死循环
loop
loop {
// ...
}
- 条件循环
while
while i < n {
// ...
}
- 迭代器循环
for
这里需要注意的是,for
循环可以用于任何实现了IntoIterator trait
的数据结构。并且for是一个语法糖,编译器会将其展开使用loop
循环对迭代器进行循环访问,直到返回None
// 0..n --> 0 <= x < n ,是一个左闭右开的区间
for _i in 0..n {
// ...
}
- 分支跳转
表达式为真,执行随后的代码块,否则执行else
后的代码块
if age < 18 {
println!("little");
} else {
println!("big");
}
模式匹配
match
用于匹配struct
结构体和enum
中匹配部分或者全部的数据结构
fn match_process(event:&Event){
match event {
Event::Join((uid,_tid)) => println!("UserId: {:?}", uid),
Event::Leave((uid,tid)) => println!("Leave: {:?}", uid),
Event::Message((_, _, msg))=> print!("msg: {}", msg),
}
}
// UserId: UserId(1)
// UserId: UserId(2)
// msg: hello world!
if let
是为了简化匹配的过程,只匹配某一个过程
fn process_message(event: &Event) {
if let Event::Message((_, _, msg)) = event {
println!("broadcast: {}", msg);
}
}