rust 初探 -- 枚举和模式匹配

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<i8> = Some(5);
	//将 Option<T> 中的 T 转换成 T
    let yy = y.expect("get Option<i8> 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<i32>) -> Option<i32> {
    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");
    }
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mac Rust io-uring是一种在Mac操作系统上使用Rust语言进行开发的io-uring库。 io-uring是Linux内核中的一个新特性,它为应用程序提供了一种高性能、高效率的异步I/O操作方式。它通过使用事件驱动和无锁技术,实现了在高并发环境下进行文件操作的优化。io-uring提供了更低的系统开销和更高的吞吐量,特别适用于需要大量I/O操作的应用程序。 虽然io-uring最初是为Linux内核设计的,但由于其高性能的特性,一些开发者试图将其移植到其他操作系统上。其中,Mac Rust io-uring就是一个在Mac操作系统上使用Rust语言实现io-uring的库。 使用Mac Rust io-uring,开发者可以在Mac环境下利用io-uring的特性来提高文件操作的性能。这对于需要进行大量I/O操作的应用程序来说,是一个很有价值的工具。例如,对于数据库、Web服务器或文件传输等应用,通过使用Mac Rust io-uring,可以显著提高其性能和吞吐量。 Mac Rust io-uring不仅提供了对io-uring的封装,还提供了一些更高级别的功能和接口,以方便开发者使用。开发者可以使用Mac Rust io-uring来实现一些高级的文件操作,例如批量读取或写入文件,提高数据处理的效率。 总之,Mac Rust io-uring是一个在Mac操作系统上使用Rust语言开发的io-uring库,它能够为开发者提供高性能的异步I/O操作方式,从而提高应用程序的性能和吞吐量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiangw557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值