rust 初探 -- 枚举和模式匹配
创始人
2024-12-17 15:36:53
0

rust 初探 – 枚举和模式匹配

定义枚举

enum IpAddrKind {     // 将数据附加到枚举的变体中     // - 不需要额外使用 struct     // - 每个变体可以拥有不同的类型以及关联的数据量     V4(String),      V6(String), } 
  • 可以使用 impl 为枚举定义方法
 enum IpAddrKind {     a,     b(String),     c{x: i32, y: i32}, }  impl IpAddrKind {     fn call(&self) {} }  fn main() {     let aa = IpAddrKind::a;     let bb = IpAddrKind::b(String::from("hello"));     let cc = IpAddrKind::c { x: 12, y: 21 };      bb.call(); } 

Option 枚举

  • 定义在标注库中,在 Prelude(预导入模块)中

rust 没有 Null

  • Null 的问题:当你尝试像使用非 Null 值那样使用 Null 值的时候,就会引起某种错误
  • Null 的作用:因某种原因而变为无效或缺失的值(Option)
Option 的优点
  • Option 和 T 是不同的类型,不可以把 Option 直接当作 T
  • 若想使用 Option 中的 T,必须把它转换成 T,避免了错误使用 null 进行操作(非Option 的肯定不是空的,否则就需要转换)
    示例:
fn main() {     let x: i8 = 5;     let y: Option = Some(5); 	//将 Option 中的 T 转换成 T     let yy = y.expect("get Option fail");     let sum = x + yy;     println!("{}", sum) } 

match

  • 允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码(示例)
enum Num {     One,     Two,     Three, }  fn value_in_cents(num: Num) -> u8 {     // 依次匹配     match num {         Num::One => {             println!("match One");             1         },         Num::Two => 2,         Num::Three => 3,     } }   fn main() {     let num = Num::One;      println!("{}", value_in_cents(num)) } 
  • 绑定值的模式:匹配的分支可以绑定到被匹配对象的部份值,可以从 enum 变体中提取值
 #[derive(Debug)] enum Name {     Tim,     Hope, } enum Num {     One,     Two,     Three(Name), }  fn value_in_cents(num: Num) -> u8 {     // 依次匹配     match num {         Num::One => {             println!("match One");             1         },         Num::Two => 2,         Num::Three(name) => {             println!("three name is: {:#?}", name);//three name is: Hope             3         },     } }  fn main() {     let num = Num::Three(Name::Hope);      println!("{}", value_in_cents(num)) // 3 } 

匹配 Option

fn main() {     let five = Some(5);     let six = plus_one(five);     let none = plus_one(None);      // println!("{}, {}", six, none); }   fn plus_one(x: Option) -> Option {     match x {         None => None,         Some(i) => Some(i+1),     } } 
  • match 匹配必须穷举所有的可能性(会在编译时检查),如果不需要处理,可以使用通配符“_”替代:
fn main() {     let v = 0u8;     match v {         1 => println!("one"),         2 => println!("two"),         _ => (),     } } 

if let

  • 处理只关注一种匹配,而忽略其他匹配的情况
  • 更少的代码,更少的缩进,更少的模版代码
  • 但是放弃了穷举的可能
fn main() {     let v = 0u8;     match v {         2 => println!("two"),         _ => println!("other"),     } 	// 等效于上面的逻辑     if let 2 = v {         println!("two");     } else {     	println!("other");     } } 

相关内容

热门资讯

实测交流!好友赣南斗牛外 挂(... 实测交流!好友赣南斗牛外 挂(辅助挂)外挂透明挂辅助app(2021已更新)(哔哩哔哩)1、好友赣南...
wepoke作弊器!nzt德州... wepoke作弊器!nzt德州果真真的有挂,微扑克ai辅助器苹果版规律1、进入到微扑克ai辅助器苹果...
玩家交流!中至都昌讨赏有挂吗(... 玩家交流!中至都昌讨赏有挂吗(辅助挂)竟然真的是有挂(2024已更新)(哔哩哔哩)1)中至都昌讨赏有...
二分钟介绍!天天斗地主修改器,... 二分钟介绍!天天斗地主修改器,星悦云南麻将有没有假(果然有挂);1、完成星悦云南麻将有没有假的残局,...
二分钟发现!多乐第三方辅助器,... 二分钟发现!多乐第三方辅助器,同城上饶棋牌确实有挂,存在挂教程(有挂机密);1、游戏颠覆性的策略玩法...
重大通报!宁波竞技馆有挂吗(透... 重大通报!宁波竞技馆有挂吗(透视辅助)外挂透视辅助app(2021已更新)(哔哩哔哩)1、打开软件启...
wepoke辅助技巧!poke... wepoke辅助技巧!pokenow其实是真的有挂,德州ai辅助神器黑科技1、超多福利:超高返利,海...
分享开挂内幕!天天开心王国十三... 分享开挂内幕!天天开心王国十三水有没有外 挂(辅助挂)一贯真的是有挂(2020已更新)(哔哩哔哩)1...
五分钟方法!全民牛牛怎么提升胜... 五分钟方法!全民牛牛怎么提升胜率,白金岛辅助工具(一直有挂)1、全民牛牛怎么提升胜率机器人多个强度级...
玩家必看教程!!钱塘十三水输赢... 玩家必看教程!!钱塘十三水输赢概率(透明挂)外挂透明挂辅助软件(2020已更新)(哔哩哔哩)钱塘十三...