Rust基础05-初见结构体

初识struct

  • 何为struct:

    struct,即为结构体,是一种允许自定义的数据类型

    其允许为一组相关联的值命名并打包为有意义的组合

  • 定义struct:

    使用 struct 关键字,并为整个 struct 命名

    在花括号中,为所有字段(Field)定义名称和类型

    struct User {
        username:String.
        email:String,
        sign_in_count:u64,
        active:bool,
    };
    
  • 实例化struct:

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

    • 为每个字段指定具体值
    • 无需按声明的顺序进行指定
    struct User {
        username:String.
        email:String,
        sign_in_count:u64,
        active:bool,
    };
    
    let user1 = User {
        email:String::from("someone@example.com"),
        username:String::from("someusername123"),
        active:true,
        sign_in_count:1,
    };
    
  • 取得 struct 中的某个值:

    使用点标记法:

    struct User {
        username:String.
        email:String,
        sign_in_count:u64,
        active:bool,
    };
    
    let mut user1 = User {
        email:String::from("someone@example.com"),
        username:String::from("someusername123"),
        active:true,
        sign_in_count:1,
    };
    
    user1.email = String::from("anotheremail@example.com")
    

    注意:一旦 struct 实例可变,那么实例中-所有的字段均可变

  • struct 作为函数的返回值:

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

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

    fn build_user(email:String, username:String) -> User {
        User {
            email,//已简写
            username,//已简写
            active:true,
            sign_in_count:1,
        }
    }
    
  • struct 更新语法:

    当想基于某个 struct 实例来创建一个新实例时,可以使用 struct 更新语法

    见下例 main函数 user2 中使用了更新语法

    struct User {
        username: String,
        email: String,
        sign_in_count: u64,
        active: bool,
    }
    
    fn main() {
        let user1 = User {
            email: String::from("one@example.com"),
            username: String::from("username555"),
            sign_in_count:1,
            active:true,
        };
    
        let user2 = User {
            email: String::from("another@example.com"),
            username: String::from("anotherusername567"),
            ..user1
        };
    }
    
  • Tuple struct:

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

    1. Tuple struct 整体有名,内部元素无名
    2. 适用于想给整个 Tuple 起名,并让它不同于其他 tuple,而且不需要给每个元素起名

    定义 tuple struct:

    使用 struct 关键字,后面为名字,以及内部元素的类型

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

    其中 black 和 origin 是不同的类型,是不同 tuple struct 的实例

  • Unit-Like Struct (无任何字段)

    可以定义没有任何字段的 struct,叫做 Unit-Like struct (因为与(),单元类型类似)

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

  • struct 数据的所有权:

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

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

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

    struct 里也可以存放引用,但这需要使用生命周期

posted on 2022-03-27 19:02  Baby091  阅读(57)  评论(0编辑  收藏  举报

导航