"首次提交"
This commit is contained in:
1
enum_learn/.gitignore
vendored
Executable file
1
enum_learn/.gitignore
vendored
Executable file
@ -0,0 +1 @@
|
||||
/target
|
8
enum_learn/Cargo.toml
Executable file
8
enum_learn/Cargo.toml
Executable file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "enum_learn"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
118
enum_learn/src/main.rs
Executable file
118
enum_learn/src/main.rs
Executable file
@ -0,0 +1,118 @@
|
||||
use std::{net::IpAddr, string};
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
enum_learn();
|
||||
enum_option();
|
||||
}
|
||||
|
||||
fn enum_learn(){
|
||||
|
||||
//定义枚举使用关键字enum,不附带数据
|
||||
enum IpAddr_test{
|
||||
V4,
|
||||
V6,
|
||||
}
|
||||
struct ipv4{
|
||||
addr0:u8,
|
||||
addr1:u8,
|
||||
addr2:u8,
|
||||
addr3:u8,
|
||||
}
|
||||
//定义枚举并附加一些数据
|
||||
enum IpAddr{
|
||||
//元组
|
||||
V4(u8,u8,u8,u8),
|
||||
V6(String),
|
||||
//匿名结构体
|
||||
V4_1{addr0:u8, addr1:u8, addr2:u8, addr3:u8},
|
||||
//具名结构体, 使用元组和匿名结构体的方式组织
|
||||
V4_2(ipv4),
|
||||
V4_3{addr:ipv4},
|
||||
}
|
||||
//可通过impl 定义枚举的方法&关联函数。和struct类型的impl的使用类似
|
||||
impl IpAddr{
|
||||
fn print_addr(&self){
|
||||
//使用match方法匹配枚举值,并提取出其相关的数据使用
|
||||
match self {
|
||||
//使用元组的方式那么这里对应的数据也是需要用 () 进行解构的
|
||||
IpAddr::V4(val0,val1,val2,val3) => {
|
||||
println!("addr is {}.{}.{}.{}", val0, val1,val2,val3);
|
||||
},
|
||||
IpAddr::V6(addr_str) => {
|
||||
println!("addr is {}", addr_str);
|
||||
},
|
||||
//使用结构体的方式那么这里对应的数据也是需要用 {} 进行解构的
|
||||
IpAddr::V4_1 { addr0, addr1, addr2, addr3 } => {
|
||||
println!("addr is {}.{}.{}.{}", addr0, addr1,addr2,addr3);
|
||||
},
|
||||
IpAddr::V4_2(addr) => {
|
||||
println!("addr is {}.{}.{}.{}", addr.addr0, addr.addr1, addr.addr2, addr.addr3);
|
||||
},
|
||||
IpAddr::V4_3{addr} => {
|
||||
println!("addr is {}.{}.{}.{}", addr.addr0, addr.addr1, addr.addr2, addr.addr3);
|
||||
},
|
||||
//匹配其他情况
|
||||
_ => {
|
||||
println!("not support");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//函数体内可以再定义函数。其作用域只在本函数内
|
||||
fn sub(){
|
||||
//使用元组的方式初始化
|
||||
let home = IpAddr::V4(127,0,0,1);
|
||||
let lookup = IpAddr::V6(String::from("::"));
|
||||
//使用结构体的方式初始化
|
||||
let home1 = IpAddr::V4_1{addr0:127,addr1:0,addr2:0,addr3:1};
|
||||
let addr = ipv4{addr0:127,addr1:0,addr2:0,addr3:1};
|
||||
//具名结构体,使用元组
|
||||
let home2 = IpAddr::V4_2(addr);
|
||||
//具名结构体,使用结构体的方式初始化
|
||||
let home3 = IpAddr::V4_3{addr:ipv4{addr0:127,addr1:0,addr2:0,addr3:1}};
|
||||
|
||||
home.print_addr();
|
||||
lookup.print_addr();
|
||||
home1.print_addr();
|
||||
home2.print_addr();
|
||||
home3.print_addr();
|
||||
}
|
||||
//调用函数, 如果局部的函数和全局的有同名的。优先局部的
|
||||
sub();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* 在rust中没有NULL的使用,其使用一个特殊的枚举Option<T> 来表达可能有值或者没有值的意思
|
||||
想要使用Option的变量必须对其进行转化,转为T方可使用,从而保证了其在可以使用时一定是有值的。
|
||||
*/
|
||||
fn enum_option(){
|
||||
let mut num1 = Some(2); // 编译器可自动推导出类型 T
|
||||
let num2 = 10;
|
||||
let num3: Option<i64> = Some(5);// 也可以显式进行指定
|
||||
let num4: Option<i32> = None; // 如果未None时编译器无法自动推断类型,所以需要显式进行指定 T 是什么类型
|
||||
let str1 = Some(String::from("a Option string"));
|
||||
|
||||
// case1: 不能直接使用 + 来操作一个Option<T>和T,因为是两个不同的类型,不能直接相加
|
||||
//let ret1:i32 = num1 + num2;
|
||||
fn add(num1:Option<i32>, num2:i32) -> i32{
|
||||
match num1 {
|
||||
Some(num) => num + num2,// 使用match仅仅在其有值的情况下进行使用
|
||||
None => {
|
||||
println!("num1 is None!");
|
||||
num2
|
||||
},
|
||||
}
|
||||
}
|
||||
let ret1 = add(num1, num2);
|
||||
println!("{:?}(num1) + {}(num2) => ret1: {}", num1, num2, ret1);
|
||||
|
||||
// case2: Option<T> 没有 + 操作符,也不能直接相加
|
||||
//let ret2:i32 = num1 + num3;
|
||||
|
||||
num1 = num4; // 可以将 Option<T> (T相同) 的变量之间进行所有权的转移
|
||||
//num1 = num3; // num3 是 Option<i64>, num1是 Option<i32> 不能绑定
|
||||
|
||||
println!("{:?}(num1) + {}(num2) => ret2: {}", num1, num2, ret2);
|
||||
}
|
Reference in New Issue
Block a user