Rust开发—— 枚举与Option枚举

前言

枚举可以为程序带来有利于安全的输入处理,并通过给枚举变量一个名称来为类型添加上下文。在 rust 中,最常见到的枚举是Option和Result。Rust 中的枚举相比于的其它语言(C类语言)有很大的灵活性。它可以包含许多数据类型,如元组、结构等,枚举也可以异构。此外,还可以像struct一样对枚举实现方法。枚举模式匹配是rust语言最重要的功能之一。

枚举

1.普通定义枚举

enum Gender 
{
    male,
    female,
    neutrois,
}

2.使用枚举

fn main() 
{
    let f : Gender = Gender::female;
    get_gender(f);
}
fn get_gender(gender : Gender)
{
    print!("{:?} \n",gender);
}
  1. 异构的枚举
#[derive(Debug)]
enum IpAddr 
{
    V4(u8, u8, u8, u8), 
    V6(String), 
}

fn main() 
{
    
    let V4 = IpAddr::V4(127, 0, 0, 1);
  
    let V6 = IpAddr::V6("::1".to_string());
    get_ipaddr(V4);
    get_ipaddr(V6);
    
}

fn get_ipaddr(ip : IpAddr)
{
    println!("{:?}\n",ip);
}

4.匹配枚举
使用 match 关键字可以对 enum 进行模式匹配。

fn matcher(x : Gender) 
{
    match x
    {
        Gender::female => print!("Gender is female"),
        Gender::male =>print!("Gender is male"),
        Gender::neutrois =>print!("Gender is neutrois"),
    }    
}

给 matcher 函数传递一个枚举值,函数会把匹配到的输出:

fn main() 
{
    let f : Gender = Gender::female;
    matcher(f);
}

5.给枚举定义方法

#[derive(Debug)]
enum Gender 
{
    male,
    female,
    neutrois,
}

impl Gender
{
    fn call(&self)
    {
        print!("{:?}",self);
    }
}

let f : Gender = Gender::female;
f.call();

Option枚举

1.Option枚举原型

pub enum Option<T> 
{
    None,
    Some(T),
}

Option < T > 是一个包含两个值的枚举: None 和 Some (T)。“None”可以被认为是没有任何值,而“Some”(T)可以被认为是存在某个值。这里的T是一个泛型,意思就是任何类型。只是“ T”作为一个约定使用,也可使用别的字母代替。Option枚举是为避免空空指针的出现。

  1. 使用 Option 这个枚举是 rust 为了不使用 null 值和异常,假设,要去判断一个字符串的是否为空,要用C++实现则:
String str = "";
if(str == null)
{
	------
}
else
{
	-------
}

如果是new出来的变量,变量为空时要释放则会出现异想不到的问题,rust是为了避免使用null而设计的Option 枚举。使用rust实现上面的例子:

 let str : Option<String> = None;
    
    match str
    {
        Some(v) =>  println!("We go something: {}", v),
        None => println!("We got nothing"),
    }
    
  1. unwrap
    当对一个值进行调用时,使用“unwrap”可能获取 Some 变量中的值。如果存在 Some 有值,则值为该类型并返回。如果存在“None”变体,则引发恐慌:
let something: Option<&str> = Some("Something");
let unwrapped = something.unwrap(); 
println!("{:?}\n{:?}", something, unwrapped);
let nothing: Option<&str> = None;
nothing.unwrap();
  1. 让函数返回一个Option枚举
fn contains_char(text: String, target_c: char) -> Option<String> 
{
    if text.chars().any(|ch| ch == target_c)
    {
        return Some(text);
    } 
    else 
    {
        return None;
    }
}

let a = contains_char("Rust in action".to_string(), 'a');
let q = contains_char("Rust in action".to_string(), 'q');
println!("{:?}", a);
println!("{:?}", q);

5.Option做为参数传入函数

fn might_print(option: Option<&str>) 
{
    match option 
    {
        Some(text) => println!("The argument contains the following value: '{}'", text),
        None => println!("The argument contains None."),
    }
}
let something: Option<&str> = Some("some str");
let nothing: Option<&str> = None;
might_print(something);
might_print(nothing);
  1. 结构体中的Option枚举
#[derive(Debug)]
struct Person 
{
    name: String,
    age: Option<i32>,
}

let marie = Person 
{
    name: String::from("matt"),
    age: Some(2),
};

let jan = Person 
{
    name: String::from("mora"),
    age: None,
};
println!("{:?}\n{:?}", marie, jan);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Rust 中,`Arc`、`Mutex` 和 `Option` 都是非常常用的类型,尤其是在多线程编程中。 `Arc` 是一个智能指针类型,它可以在多线程环境中安全地共享数据。`Arc` 的全称是“原子引用计数器”(Atomic Reference Counting),它可以让多个线程同时拥有同一个值的所有权,并且保证所有权的转移是线程安全的。 `Mutex` 是一个互斥体类型,它可以保证在同一时刻只有一个线程能够访问被锁定的数据。在多线程编程中,如果多个线程同时访问同一个变量,就会出现竞争条件(Race Condition),导致程序出错。使用 `Mutex` 可以解决这个问题。 `Option` 是一个枚类型,它可以表示一个值存在或不存在。在多线程编程中,如果多个线程同时访问同一个变量,就可能会出现空指针异常(Null Pointer Exception)。使用 `Option` 可以明确地表示一个值是否存在,从而避免这个问题。 下面是一个使用这些类型的例子: ```rust use std::sync::{Arc, Mutex}; fn main() { let data = Arc::new(Mutex::new(Some("hello"))); let mut handles = vec![]; for i in 0..10 { let data = data.clone(); let handle = std::thread::spawn(move || { let mut data = data.lock().unwrap(); // 这里使用了 take 方法,将 Option 类型的值取出来并赋值为 None // 这样可以避免多个线程同时访问同一个变量的问题 let value = data.take().unwrap(); println!("Thread {} got value: {}", i, value); }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } } ``` 上面的代码创建了一个共享数据 `data`,它是一个 `Arc<Mutex<Option<&str>>>` 类型。在每个线程中,我们都使用了 `data.lock().unwrap()` 来获取数据的可变引用,并使用了 `take()` 方法将数据取出来。这样所有的线程都可以安全地访问 `data` 的值,而不用担心竞争条件和空指针异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

知来者逆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值