• Rust学习——枚举和模式匹配


    一、枚举(enums)
    Rust中枚举由成员(variants)组成

    枚举替代结构体优势:
    1. 每个成员可以处理不同类型和数量的数据

    结构体与枚举相似点:
    1. 都可以使用impl定义方法
    2. 方法体都使用self来获取调用方法的值

    Rust没有空值(即Null),但Rust拥有一个可以编码存在或不存在概念的枚举(Option):
    enum Option {
    Some(T),
    None,
    }
    Options枚举很有用,所以已内置在prelude中无需显示引入作用域。它的成员也不需要通过Option::前缀来使用,可直接使用Some和None。即使如此,成员依旧是成员。

    若使用None而不是Some,则需要显示声明Option的类型,即传入具体T的类型,因为编译器只通过None无法推断Some成员保存值的类型。

    在对 Option 进行 T 的运算之前必须将其转换为 T。
    通常这能帮助我们捕获到空值最常见的问题之一:假设某值不为空但实际上为空的情况。

    使用Option优点:
    不再担心会错误的假设一个非空值,会让你对代码更加有信心。

    二、控制流运算符(match)
    与if表达式区别:if表达式必须返回一个bool值,而match中可以返回任意类型值。

    一个match分支有两个部分:
    1. 一个模式
    2. 一些代码

    1. 绑定值的模式
      enum UsState {
      Alabama,
      Alaska,
      }
      enum Coin {
      Penny,
      Nickel,
      Dime,
      Quarter(UsState),
      }

    fn value_in_cents(coin: Coin) -> u8 {
    match coin {
    Coin::Penny => 1,
    Coin::Nickel => 5,
    Coin::Dime => 10,
    Coin::Quarter(state) => {
    println!("State quarter from {:?}!", state);
    25
    },
    }
    }

    调用 value_in_cents(Coin::Quarter(UsState: :Alaska))即可访问到值Alaska。

    2.匹配Option
    一个在 Option 上使用 match 表达式的函数:
    fn plus_one(x: Option) -> Option {
    match x {
    None => None,
    Some(i) => Some(i + 1),
    }
    }

    let five = Some(5);
    let six = plus_one(five);
    let none = plus_one(None);

    将 match 与枚举相结合在很多场景中都是有用的。

    Rust中的匹配是穷尽的(exhaustive):必须穷举到最后的可能性来使代码有效。

    3.通配符(
    Rust提供一个模式用于不想列举出所有可能值的场景。
    “ 模式会匹配所有的值,通过将其放置于其他分支之后,_ 会匹配所有之前没有指定的可能的值。

    然而,match 在只关心仅一个分支的场景中显得啰嗦了,所以Rust提供了 " if let "。

    三、简洁控制流(if let)
    if let 获取获取通过等号分隔的一个模式和一个表达式。
    使用if let 会失去 match 强制要求的穷尽性检查。
    所以使用match 还是 if let 需要去权衡。

    if let 可以包含一个else

    学习是一条令人时而喜极若狂、时而郁郁寡欢的道路。
  • 相关阅读:
    九省联考2018 解题报告
    「PKUSC2018」最大前缀和(状压dp)
    「雅礼集训 2017 Day2」解题报告
    UVA10829 L-Gap Substrings(后缀数组+ST表)
    [BZOJ2738]矩阵乘法(整体二分+二维树状数组)
    「雅礼集训 2017 Day1」 解题报告
    LeetCode 190. Reverse Bits (算32次即可)
    LeetCode 437. Path Sum III (STL map前缀和)
    LeetCode 744. Find Smallest Letter Greater Than Target (时间复杂度O(n))
    LeetCode 1. Two Sum (c++ stl map)
  • 原文地址:https://www.cnblogs.com/tim100/p/15624603.html
Copyright © 2020-2023  润新知