Rust中的struct

108 阅读2分钟

1.什么是struct

struct是结构体

  • 自定义的数据类型
  • 为相关联的值命名,打包,然后组成一组有意义的组合

2.定义struct

使用struct关键字,并为整个struct命名 在花括号内,为所有字段(Field)定义名称和类型

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

3.实例化struct

想要使用struct,需要创建struct的实例

  • 为每个字段指定具体值
  • 无需按声明的顺序进行指定
struct User {
    username: String,
    email:String,
    sign_in_count:u64,
    active:bool,
}

fn main() {
    let user1 = User {
        email: String::from("hdat.top"),
        username: String::from("hdat"),
        active: true,
        sign_in_count: 600,
    };
    println!("{}",user1.email); // hdat.top
}

更改struct里面的某个值

首先要让他是可变的

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

fn main() {
    let mut user1 = User {
        email: String::from("hdat.top"),
        username: String::from("hdat"),
        active: true,
        sign_in_count: 600,
    };
    user1.email = String::from("hdat@163.com");
    println!("{}",user1.email); // hdat@163.com
}

一旦这个struct的实例是可变的,那么这个实例中所有的字段都是可变的

4.struct 作为函数的返回值

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

fn return_user(email:String,username:String) -> User {
    User {
        email: email,
        username :username,
        active: true,
        sign_in_count: 300,
    }
}

fn main() {
    let my_user = return_user(String::from("hdat@gmail.com"),String::from("hdata"));
    println!("{}",my_user.email); // hdat@gmail.com
}

5.字段初始化简写

当字段名和字段值对应变量名相同时,就可以使用字段初始化简写的方式

// 字段初始化时简写
fn build_user(email:String,username:String) -> User {
    User {
        username,
        email,
        active: true,
        sign_in_count: 121,
    }
}

6.struct更新语法

如果需要基于某个现有struct实例来创建一个新实例的时候,可以使用struct的更新语法

// 更新语法
    // let user2 = User {
    //     email: String::from("new_hdat.top"),
    //     username: String::from("new_hdat"),
    //     active: true,
    //     sign_in_count: 600,
    // };

    let user2 = User {
        email: String::from("new_hdat.top"),
        username: String::from("new_hdat"),
        ..user1
    };
    println!("{}",user2.active);

更新user1来获得user2

7.Tuple struct

可以定义类似tuple的struct,叫做tuple struct

适用于:给tuple整体起名,但是不用给每个元素起名,并让他不同于其他tuple

定义tuple struct

// tuple struct
    struct Color(i32,i32,i32);
    struct Point(i32,i32,i32);
    let black = Color(0,0,0);
    let origin = Point(2,2,2);
    // black 和 origin 是不同的类型,因为他们是不同 tuple struct 的实例

8.Unit-Like Struct (没有任何字段)

可以定义没有任何字段的struct, 叫Unit-Like struct

这个用于需要在某个类型上实现某个trait,但是在里面又没有想要存储的数据。

9.struct数据的所有权

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

这个结构体定义的时候,字段使用了String而不是&str

那么这样该struct实例拥有其所有的数据的所有权,只要struct实例是有效的,那么里面的字段数据也是有效的。

struct里面也可以存放引用,但是需要使用生命周期。生命周期保证struct实例是有效的,那么里面的引用也是有效的。