HGQ's blog HGQ's blog
🏠首页
📚学习笔记
💻技术
  • 😋碎碎念
  • 🏞美好瞬间
🙈关于
  • 分类
  • 标签
  • 归档
  • 前端网站
  • 后端网站
  • 其他
🔗友链
GitHub (opens new window)

HuangGaoQing

一名程序员
🏠首页
📚学习笔记
💻技术
  • 😋碎碎念
  • 🏞美好瞬间
🙈关于
  • 分类
  • 标签
  • 归档
  • 前端网站
  • 后端网站
  • 其他
🔗友链
GitHub (opens new window)
  • 前端

  • rust

    • rust struct
    • rust 枚举
      • 枚举声明/使用
      • 枚举允许将数据附加到枚举值中
      • 给枚举定义方法
      • Option枚举
      • 枚举与match模式匹配
      • 通过match获取绑定值的枚举项
        • Option 枚举
      • if let 使用
    • Package, Crate, Moudle
  • 学习笔记
  • rust
huanggaoqing
2023-10-28
目录

rust 枚举

# 枚举声明/使用

// 声明/创建
enum IpAddr {
  V4,
  V6
}
//使用
let addr = IpAddr::V4;
let addr = IpAddr::V6;
1
2
3
4
5
6
7
8

# 枚举允许将数据附加到枚举值中

  • 不需要额外的struct来关联
  • 每个枚举值都可以是不同的类型
// 声明/创建
enum IpAddr {
  V4(u8, u8, u8, u8),
  V6(String)
}
// 使用
let addr = IpAddr::V4(127, 0, 0, 1);
let addr = IpAddr::V6(String::from("::8080"));
1
2
3
4
5
6
7
8

# 给枚举定义方法

// 声明/创建
enum IpAddr {
  V4(u8, u8, u8, u8),
  V6(String)
}
impl IpAddr {
  fn call(&self) {
    println!("call method run")
  }
}
// 使用
let addr = IpAddr::V6(String::from("::8080"));
addr.call();
1
2
3
4
5
6
7
8
9
10
11
12
13

# Option枚举

用于描述一个值是否存在,存在则是 Some(t) ,不存在则为 None 。

rust没有Null或Undefined,但是保留了Null的概念:因为某种原因变为无效或缺失的值。Option枚举就是为了解决这个问题的,有值的时候返回Some(t) ,否则返回None 。

这样的好处在于,当要使用 Option<T> 的值时,必须要将T取出来使用,这个取值的过程中相当于做了一次检查,检查了是否存在值,为Some(t) 就把值获取出来使用,为None 就做其他处理。

  • Option在标准库中的定义

    pub enum Option<T> {
        /// No value.
        #[lang = "None"]
        #[stable(feature = "rust1", since = "1.0.0")]
        None,
        /// Some value of type `T`.
        #[lang = "Some"]
        #[stable(feature = "rust1", since = "1.0.0")]
        Some(#[stable(feature = "rust1", since = "1.0.0")] T),
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  • 简单使用

    当一个变量的值为 None 时需要明确的指定这个变量的类型,因为编译器无法推断出值为None 的变量的类型

    let f = Some("test");
    let f2: Option<i32> = None;
    
    1
    2

# 枚举与match模式匹配

enum Coin {
  Penny,
  Nickel,
  Dime,
  Quarter
}

fn value_in_cents(coin: &Coin) -> u8 {
  match coin {
    Coin::Dime => 10,
    Coin::Nickel => 5,
    Coin::Penny => 1,
    Coin::Quarter => 25
  }
}

println!("coin: {}", value_in_cents(&Coin::Quarter)); // coin: 25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 通过match获取绑定值的枚举项

  • match匹配必须穷举全部可能性
  • 如果不想处理所有的可能性时,使用_通配符统一处理剩余可能性 _ => println!("其他可能性") 。_通配符需要放在最后。

获取到Quarter枚举项所绑定的值

提示

因为获取到的值是个引用类型,所以需要使用*解引用后返回

enum Coin {
  Penny,
  Nickel,
  Dime,
  Quarter(u8)
}

fn value_in_cents(coin: &Coin) -> u8 {
  match coin {
    Coin::Dime => 10,
    Coin::Nickel => 5,
    Coin::Penny => 1,
    Coin::Quarter(state) => *state
  }
}
println!("coin: {}", value_in_cents(&Coin::Quarter(66))); // coin: 66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# Option 枚举

fn handle_add(params: &Option<i32>) -> Option<i32> {
  match params {
    None => {
      println!("值为 none");
      None
    },
    Some(data) => Some(data + 1)
  }
}

let n = Some(5);
let n2: Option<i32> = None;
println!("n1: {:?}, n2: {:?}", handle_add(&n), handle_add(&n2)); // n1: Some(6), n2: None
1
2
3
4
5
6
7
8
9
10
11
12
13

# if let 使用

if let作用和match很像,但if let 比较适合处理简单的模式匹配处理,比如只想处理某一种模式的时候可以使用,也可以搭配else和else if使用

可以看做match的语法糖

fn handle_add(params: &Option<i32>) -> Option<i32> {
  if let Some(data) = params {
    return Some(data + 1)
  }
  *params
}

let n = Some(5);
let n2: Option<i32> = None;
println!("n1: {:?}, n2: {:?}", handle_add(&n), handle_add(&n2)); // n1: Some(6), n2: None
1
2
3
4
5
6
7
8
9
10
编辑 (opens new window)
#rust
上次更新: 2024/01/15, 02:08:26
rust struct
Package, Crate, Moudle

← rust struct Package, Crate, Moudle→

最近更新
01
Package, Crate, Moudle
11-05
02
其他
11-04
03
后端网站
11-04
更多文章>
Theme by Vdoing | Copyright © 2023-2024 HuangGaoQing | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式