"首次提交"

This commit is contained in:
2024-06-08 15:01:12 +08:00
parent 6e0f708d0a
commit 84349a2469
112 changed files with 3272 additions and 0 deletions

1
enum_learn/.gitignore vendored Executable file
View File

@ -0,0 +1 @@
/target

8
enum_learn/Cargo.toml Executable file
View 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
View 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);
}