【百例RUST - 008】枚举

张开发
2026/4/17 13:04:51 15 分钟阅读

分享文章

【百例RUST - 008】枚举
【百例RUST - 008】枚举第一章 基础用法第01节 类似C语言的定义方式定义格式enum 枚举名称{ 枚举值1, 枚举值2, }案例代码fnmain(){// 类似于 C语言的定义方式#[derive(Debug)]// 这里的宏, 只是为了方便输出看结果enumIpAddKind{V4,V6,}#[derive(Debug)]// 这里的宏, 只是为了方便输出看结果structIpAddr{kind:IpAddKind,address:String,}leti1IpAddr{kind:IpAddKind::V4,address:String::from(127.0.0.1),};leti2IpAddr{kind:IpAddKind::V6,address:String::from(fe80::202:b3ff:fe1e:8329),};println!(i1 {:#?},i1);println!(i2 {:#?},i2);}// i1 IpAddr {// kind: V4,// address: 127.0.0.1,// }// i2 IpAddr {// kind: V6,// address: fe80::202:b3ff:fe1e:8329,// }第02节 rust推荐的定义方式相同的类型方案fnmain(){// rust 推荐的定义方式#[derive(Debug)]enumIpAddKind{V4(String),V6(String),}leti1IpAddKind::V4(String::from(127.0.0.1));leti2IpAddKind::V6(String::from(fe80::202:b3ff:fe1e:8329));println!(i1 {:#?},i1);println!(i2 {:#?},i2);}// i1 V4(// 127.0.0.1,// )// i2 V6(// fe80::202:b3ff:fe1e:8329,// )不同的类型方案fnmain(){// rust 推荐的定义方式#[derive(Debug)]enumIpAddKind{V4(u8,u8,u8,u8),V6(String),}leti1IpAddKind::V4(127,0,0,1);leti2IpAddKind::V6(String::from(fe80::202:b3ff:fe1e:8329));println!(i1 {:#?},i1);println!(i2 {:#?},i2);}// i1 V4(// 127,// 0,// 0,// 1,// )// i2 V6(// fe80::202:b3ff:fe1e:8329,// )第二章 经典用法第01节 rust的经典用法案例代码// rust 经典用法#[derive(Debug)]enumMessage{Quit,Move{x:i32,y:i32},Write(String),Change(i32,i32,i32),}fnmain(){leti1Message::Quit;leti2Message::Move{x:10,y:20};leti3Message::Write(String::from(hello));leti4Message::Change(11,22,33);println!(i1 {:#?},i1);println!(i2 {:#?},i2);println!(i3 {:#?},i3);println!(i4 {:#?},i4);}// i1 Quit// i2 Move {// x: 10,// y: 20,// }// i3 Write(// hello,// )// i4 Change(// 11,// 22,// 33,// )第02节 枚举中的方法案例代码// rust 经典用法#[derive(Debug)]enumMessage{Quit,Move{x:i32,y:i32},Write(String),Change(i32,i32,i32),}// 定义枚举类型的方法准备分支选择implMessage{fnprint_message(self){matchself{Message::Quitprintln!(Quit),Message::Move{x,y}println!(Move x{}, y{},x,y),Message::Write(text)println!(Write {},text),Message::Change(a,b,c)println!(Change a{}, b{}, c{},a,b,c),}}}fnmain(){leti1Message::Quit;leti2Message::Move{x:10,y:20};leti3Message::Write(String::from(hello));leti4Message::Change(11,22,33);i1.print_message();i2.print_message();i3.print_message();i4.print_message();}// Quit// Move x10, y20// Write hello// Change a11, b22, c33第三章 选项Option第01节 基础介绍fnmain(){// 内置的 Option 中包含有 Some(T) 和 None// 对于 Option 定义不同的类型leti1Some(5);leti2Some(String::from(a string));leti3:Optioni32None;println!(i1 {:?},i1);println!(i2 {:?},i2);println!(i3 {:?},i3);// 两个不同的类型, 进行加法的运算letx:i325;lety:Optioni32Some(3);letmuttemp0;matchy{Some(i){tempi;}None{println!(do nothing);}}letsumxtemp;println!(sum {},sum);}// i1 Some(5)// i2 Some(a string)// i3 None// sum 8第02节 作为函数参数和返回值案例代码fnmain(){// 定义 Option 类型的数据letnum:Optioni32Some(5);// 调用函数letresult:Optioni32plus_one(num);// 输出结果, 输出的是 Option 类型matchresult{Noneprint!(nothing),Some(i)println!(result:{},i),}}// 定义一个加法的函数fnplus_one(opt:Optioni32)-Optioni32{matchopt{NoneNone,Some(x)Some(x1),}}// result:6

更多文章