变量和不可变性

变量

声明变量的方式

  • let: 变量,在栈上分配一个变量, 如果一个变量是可变的,那么我们需要用mut来显示的声明
    let mut a = 1
  • const: 常量,常量是一个右值,不能被修改。常量编译后被放入可执行文件的数据段,全局可访问
  • static: 静态变量,静态变量和常量一样全局客服昂文,他也被编入可执行文件的数据段中。静态变量可以使声明为可变(mut)

函数

函数的声明方式:

  1. fn name(params1: T1,...) -> T {
  2. // TODO
  3. }
  • 函数的类型和返回值必须要显示定义。如果没有返回值就可以省略,返回值默认为unit
  • 函数内部如果需要提前返回,需要用return关键字,否则最后一个表达式就是其返回值
  • 如果最后一个表达式后面添加了分号,隐含其返回值为unit(即没有返回值)
  1. fn pi()-> f64 {
  2. 3.1415926
  3. }
  4. // 加了分号证明隐式返回值为unit
  5. fn not_pi() {
  6. 3.1415926;
  7. }
  8. fn main(){
  9. let is_pi = pi();
  10. let is_unit1 = not_pi();
  11. let is_unit2 = {
  12. pi()
  13. };
  14. println!("is_pi:{:?}, is_unit1:{:?}, is_unit2:{:?}", is_pi,is_unit1,is_unit2); // is_pi:3.1415926, is_unit1:(), is_unit2:3.1415926
  15. }

数据结构

  • 枚举

枚举有两种形式:

  1. 标签联合。 enum可以承载多个不同的数据结构中的一种
#[derive(Debug)]
enum Option { 
  Some(T), 
  None, 
}
  1. 枚举
#[derive(Debug)]
enum Gender { 
  Unspecified = 0, 
  Female = 1, 
  Male = 2, 
}
  • struct
    标准结构体,可以把任何类型组合在结构体里使用

结构体有三种形式:

  1. 空结构体,不占任何内存空间struct Marker;(有啥用?)
  2. 元组结构体,struct的每个域都是匿名的,可以通过索引访问
#[derive(Debug)]
struct Color(u8,u8,u8)
  1. 普通结构体,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); 
    }
}