定义枚举

  • IP地址:IPv4、IPv6
enum  IpAddrKindf {
    V4,
    V6
}

枚举值

  • let four =lpAddrKind::V4;
  • let six = lpAddrKind::V6;

将数据附加到枚举的变体中

  • 优点:
    • 不需要额外使用 struct
    • 每个变体可以拥有不同的类型以及关联的数据量
enum  IpAddrKindf {
    V4(u8,u8,u8,u8),
    V6(String)
}

为枚举定义方法

  • 也使用impl关键字

Option 枚举

  • 定义于标准库中
  • 在 Prelude(预导入模块)中
  • 描述了:某个值可能存在(某种类型) 或不存在的情况

Rust 没有 Null

  • 其它语言中:
    • Null 是一个值,它表示“没有值”
    • 一个变量可以处于两种状态: 空值 (null)、非空
  • Null 引用: Billion Dollar Mistake
  • Null 的问题在于:当你尝试像使用非 Null 值那样使用 Nul 值的时候,就会引起某种错误
  • Null的概念还是有用的:因某种原因而变为无效或缺失的值

Rust 中类似 Null 概念的枚举 – Option

  • 标准库中的定义:
enum Option<T> {
    Some(T),
    None
}
  • 它包含在 Prelude (预导入模块) 中。可直接使用:
    • Option
    • Some(T)
    • None
fn main() {
    let some_number=Some(5);
    let some_string=Some("A String");
    let absernt_number:Option<32>=None;
}

Option
比 Null 好在哪?

  • Option
    和T是不同的类型,不可以把 Option

    直接当成T

  • 若想使用 Option
    中的 T,必须将它转换为 T
  • 而在C# 中:
    • string a = null;
    • string b=a +“12345”

控制流运算符 match

  • 允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码
  • 模式可以是字面值、变量名、通配符…
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter
}
fn value_in_cents(coin:Coin)->u8 {
    match coin {
        Coin::Penny=>1,
        Coin::Nickel=>5,
        Coin::Dime=>10,
        Coin::Quarter=>25
    }
}

绑定值的模式

  • 匹配的分支可以绑定到被匹配对象的部分值。
    • 因此,可以从 enum 变体中提取值
enum UsState {
    Alabama,
    Alaska
}

enum Coin {
    Quarter(UsState)
}
fn value_in_cents(coin:Coin)->u8 {
    match coin {
        Coin::Quarter(UsState)=>{

        }
    }
}

匹配Option

fn plus_one(x:Option<i32>)->Option<i32> {
    match x {
        None=>None,
        Some(i)=>Some(i+1)
    }
}

match 匹配必须穷举所有的可能

  • _通配符:替代其余没列出的值
fn plus_one(x:Option<i32>)->Option<i32> {
    match x {
        None=>None,
        _ =>()
    }
}

if let

  • 处理只关心一种匹配而忽略其它匹配的情况
let v=Some(0u8);
if let Some(3) = v {
    println!("three");
}
  • 更少的代码,更少的缩进,更少的模板代码
  • 放弃了穷举的可能
  • 可以把iflet 看作是 match 的语法糖
  • 搭配 else
let v=Some(0u8);
if let Some(3) = v {
    println!("three");
}else {
    println!("others");
}

原文地址:http://www.cnblogs.com/huiteresa/p/16930373.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性