ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

08-定义并实例化结构体

2022-04-29 20:34:50  阅读:173  来源: 互联网

标签:username 定义 08 实例 User 结构 email String


定义并实例化结构体(struct

定义结构体

  • 使用struct关键字给整个结构体命名

  • 在大括号中定义每一部分的名字和类型,即字段field

    struct User {
        active: bool,     
        username: String,
        email: String,
        sign_in_count: u64,      //逗号,最后一部分结尾也要加逗号
    }
    

    注意:大括号内每一部分定义后要加逗号,最后一部分字段也要加逗号

实例化结构体

要想在定义结构体后使用结构体,就要为每个字段创建具体值来创建结构体的实例

  • 创建实例以结构体名字开头

  • 在大括号中使用key:value字段名字:要储存在字段中的数据值

    • 为每个字段指定具体值
    • 无需按声明的顺序指定
    • 但是创建实例时,字段要和定义时一一对应,即定义时有几个字段,实例中就要有几个
    let user1 = User {
        email: String::from("someone@example.com"),
        username: String::from("someusername123"),
        active: true,
        sign_in_count: 1,    //顺序是可以打乱的
    };
    

取得结构体中的值

  • 点标记法(句号),使用句号为可变的结构体实例中对应的字段赋值

  • 整个实例必须是可变的;Rust不允许单独声明某一个字段为可变

    let mut user1 = User {           //user为可变的结构体,那么其中的字段也都为可变
        email: String::from("someone@example.com"),
        username: String::from("someusername123"),
        active: true,
        sign_in_count: 1,
    };
    user1.email = String::from("anotheremail@example.com");
    

结构体可作为函数的返回值

  • 可以在函数体的最后一个表达式中构造一个结构体的新实例,来隐式地返回这个实例

    fn build_user(email: String, username: String) -> User {
        User {
            email: email,       
            username: username,
            active: true,
            sign_in_count: 1,
        }        //该函数返回一个 email 和 username 的 User 结构体实例
    }            //在主函数中通过该函数给与 email 与 username 值并返回整个结构体
    

字段初始化简写(field init shorthand

  • 当字段名与字段值对应变量名相同时,可以使用字段初始化简写

    fn build_user(email: String, username: String) -> User {
        User {
            email,         //因为email字段与email参数有相同的名称
            username,      //同上
            active: true,
            sign_in_count: 1,
        }
    

结构体更新语法(struct update syntax

  • 通过一个结构体实例创建一个新实例,其中新实例中大部分值与旧实例的值相同,其他一部分值与旧实例不同

    let user1 = User {
        email: String::from("someone@example.com"),
        username: String::from("someusername123"),
        active: true,
        sign_in_count: 1,
    };
    /*这个为不使用更新语法l创建新实例
    //声明字段使顺序可以改变
    let user2 = User {
        active: user1.active,                 
        username: user1.username,             
        email: String::from("another@example.com"),   //只有这个值是新的;其余三个值都来自旧实例
        sign_in_count: user1.sign_in_count,   
    };
    */
    //更新语法
    let user2 = User {
            email: String::from("another@example.com"),
            ..user1
    };
    

元组结构体tuple struct

元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型

  • 整体有名字,里面的元素没有名字

  • 想给整个元组取一个名字,并使元组成为与其他元组不同的类型时

  • 定义时:以 struct 关键字和结构体名开头并后跟元组中的类型

    struct Color(i32, i32, i32);  //整体叫做 Color 但元素只有类型没有名字
    struct Point(i32, i32, i32);
    
    fn main() {
        let black = Color(0, 0, 0);
        let origin = Point(0, 0, 0);
    }
    

    需要注意的是, blackorigin 值的类型不同,是不同元组结构体的实例;自己定义的每一个结构体都有自己的类型,即使结构体中的字段有着相同的类型

  • 元组结构体类似元组:可以将其解构为单独的部分,也可以使用 . 后跟索引来访问单独的值

类单元结构体(unit-like structs

即一个没有任何字段的结构体

  • 类似单元类型(即没有值的元组类型)

  • 适用:想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用

  • 定义时: struct 关键字后跟名字,不加花括号或圆括号,然后加分号

    struct AlwaysEqual;
    
    fn main() {
        let subject = AlwaysEqual;
    }
    

结构体数据的所有权

  • 例子

    struct User {
        active: bool,
        username: String,    //这里字段使用的是String,而不是&str
        email: String,
        sign_in_count: u64,
    }
    
  • 这里的字段使用的是String,而不是&str

    • 该结构体实例有其所有的数据
    • 只要该结构体实例时有效的,那么里面的字段数据也时有效的
  • 结构体实例中也可以有引用(&str

    • 但需要生命周期lifetime
    • 生命周期确保结构体引用的数据有效性跟结构体本身保持一致
    • 如果在结构体中存储一个引用而不指定生命周期将是无效的
    struct User {
        active: bool,
        username: &str,    //这里字段使用的是引用
        email: &str,
        sign_in_count: u64,
    }
    

    该代码不能正常编译

标签:username,定义,08,实例,User,结构,email,String
来源: https://www.cnblogs.com/ragworm/p/16208117.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有