Rust struct 和 枚举

36 阅读2分钟

定义 strcut、定义结构体实例

struct User{
    usrname:String,
    email:String,
    sign_in_count:u64,
    active:bool,
}

fn main(){

    let usr = User{
        email:String::form("abc@163.com"),
        usrname:String::from("nikey"),
        active:true,
        sign_in_count:556,
    };
    
    usr.email = String::from("bcd@163.com");
}
  • 一旦 struct 的实例是可变的,那么实例中的所有字段都是可变的

更新修改结构体语法

//构造简写
fn _ch9(usrname: String, email: String) -> User {
    User {
        usrname,
        email,
        active: false,
        sign_in_count: 23,
    } //最后一行当返回值
}

//struct 更新语法
fn _ch10() -> User {
    let usr1 = User {
        email: String::from("abc@163.com"),
        usrname: String::from("nikey"),
        active: true,
        sign_in_count: 556,
    };

    return User {
        email: String::from("abc@163.com"),
        ..usr1//简写更新 其他属性可以直接进行 copy
    };
}

let domain = String::from("www.runoob.com");
let name = String::from("RUNOOB");
let runoob = Site {
    domain,  // 等同于 domain : domain,  省略的写法
    name,    // 等同于 name : name,  省略的写法
    nation: String::from("China"),
    traffic: 2013
};

可变实例修改

let mut p = Point { x: 10, y: 20 };
p.x = 30;
p.y = 40;

Tuple struct 元组结构体

使用是一个元组定义为一个结构体

struct Color(i32,i32,i32);
struct Point(i32,i32,i32);
let black = Color(0,0,0);
let origin = Point(0,0,0);

struct 数据的所有权

struct User{
    usrname:String,
    email:String,
    sign_in_count:u64,
    active:bool,
}

这里字段使用了String 而不是 &str:

  • struct 实例拥有其所有的数据所有权

  • 只要 struct 实例有效,那么里面的字段数据也是有效的

Option 枚举类

Option 是 Rust 标准库中的枚举类,这个类用于填补 Rust 不支持 null 引用的空白。

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

应用 Option 的场景

fn main() {
    let opt = Option::Some("Hello");
    match opt {
        Option::Some(something) => {
            println!("{}", something);
        },
        Option::None => {
            println!("opt is nothing");
        }
    }
}

if let 语法

例子 1

let i = 0;
match i {
    0 => println!("zero"),
    _ => {},
}

改造后

let i = 0;
if i == 0 {
    println!("zero");
}

例子 2

fn main() {
    enum Book {
        Papery(u32),
        Electronic(String)
    }
    let book = Book::Electronic(String::from("url"));
    match book {
       Book::Papery(64) =>  println!("Papery {}", index),
       _ => println!("Not papery book"),
    }
}

改造后

fn main() {
    enum Book {
        Papery(u32),
        Electronic(String)
    }
    let book = Book::Electronic(String::from("url"));
    if let Book::Papery(index) = book {
        println!("Papery {}", index);
    } else {
        println!("Not papery book");
    }
}