zoukankan      html  css  js  c++  java
  • Rust-Lang Book Ch.6 Enum and Pattern Matching

    Enum的定义和实例化

    enum IpAddrKind {
        V4,
        V6,
    }
    
        let four = IpAddrKind::V4;
        let six = IpAddrKind::V6;
    
        struct IpAddr {
            kind: IpAddrKind,
            address: String,
        }
    
        let home = IpAddr {
            kind: IpAddrKind::V4,
            address: String::from("127.0.0.1"),
        };
    
        let loopback = IpAddr {
            kind: IpAddrKind::V6,
            address: String::from("::1"),
        };
    

      

    但是enum还可以有关联的struct,这样就可以减少额外声明一个struct了。

    struct QuitMessage; // unit struct
    struct MoveMessage {
        x: i32,
        y: i32,
    }
    struct WriteMessage(String); // tuple struct
    struct ChangeColorMessage(i32, i32, i32); // tuple struct
    

      

    match

    fn value_in_cents(coin: Coin) -> u8 {
        match coin {
            Coin::Penny => 1,//match arm, Coin::Penny是Pattern, =>分割Pattern和表达式
            Coin::Nickel => 5,
            Coin::Dime => 10,
            Coin::Quarter(state) => {
                println!("State quarter from {:?}!", state);//能获取内部数值
                25
            }
        }
    }
    

      

    注意在Rust中,必须处理所有可能,如果不能处理所有可能,就要使用placeholder "_",或者如果只关心一种,就要使用if let。

        let some_u8_value = 0u8;
        match some_u8_value {
            1 => println!("one"),
            3 => println!("three"),
            5 => println!("five"),
            7 => println!("seven"),
            _ => (),//() unit value,什么也不会发生
        }
    

    If let

        if let Some(3) = some_u8_value {
            println!("three");
        }
    

      

    可以加上else

        let mut count = 0;
        if let Coin::Quarter(state) = coin {
            println!("State quarter from {:?}!", state);
        } else {
            count += 1;
        }
    

      

    Option

    Rust没有null,而Option<T>中的None充当了Null的角色。

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

      

        let some_number = Some(5);
        let some_string = Some("a string");
    
        let absent_number: Option<i32> = None;//必须声明类型,不然编译器不知道具体
    

      

    程序员在使用Option<T>做正常调用之前,必须先手动将Option<T>转化为T,这一步就减少了潜在的bug。

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

      

  • 相关阅读:
    access生成sql脚本,通过VBA调用ADOX
    virtualbox 使用USB引导启动安装系统
    atom 调用g++编译cpp文件
    VPython 三维显示 —— hello word
    sql高级篇(一)
    sql基础篇
    struts2中的<s:select>默认选项
    关于SVN更新注意
    mysql中的substr()函数
    mysql中exists的用法介绍
  • 原文地址:https://www.cnblogs.com/xuesu/p/13871802.html
Copyright © 2011-2022 走看看