美文网首页Rust
5.1 - 结构体 - 定义并实例化结构体

5.1 - 结构体 - 定义并实例化结构体

作者: 空乱木 | 来源:发表于2019-08-29 10:46 被阅读0次

原文链接:https://kaisery.github.io/trpl-zh-cn/ch05-01-defining-structs.html

和元组一样,结构体的每一部分可以是不同类型。

示例 5-1:User 结构体定义

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

示例 5-2:创建 User 结构体的实例
实例中字段的顺序不需要和它们在结构体中声明的顺序一致。

fn main() {
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,
};
}

如果结构体的实例是可变的,我们可以使用点号并为对应的字段赋值。
示例 5-3 展示了如何改变一个可变的 User 实例 email 字段的值:

fn main() {
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");
}

注意整个实例必须是可变的;Rust 并不允许只将某个字段标记为可变。

示例 5-4:build_user 函数获取 email 和用户名并返回 User 实例

fn main() {
struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

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

变量与字段同名时的字段初始化简写语法
字段初始化简写语法

示例 5-5:build_user 函数使用了字段初始化简写语法,因为 email 和 username 参数与结构体字段同名

fn main() {
struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

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

结构体更新语法从其他实例创建实例
示例 5-6 展示了不使用更新语法时,如何在 user2 中创建一个新 User 实例。我们为 email 和 username 设置了新的值,其他值则使用了实例 5-2 中创建的 user1 中的同名值:

示例 5-6:创建 User 新实例,其使用了一些来自 user1 的值

fn main() {
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,
};

let user2 = User {
    email: String::from("another@example.com"),
    username: String::from("anotherusername567"),
    active: user1.active,
    sign_in_count: user1.sign_in_count,
};
}

简化写法:
如示例 5-7 所示。.. 语法指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值。

fn main() {
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,
};

let user2 = User {
    email: String::from("another@example.com"),
    username: String::from("anotherusername567"),
    ..user1
};
}

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

定义元组结构体,以 struct 关键字和结构体名开头并后跟元组中的类型。例如,下面是两个分别叫做 Color 和 Point 元组结构体的定义和用法:

fn main() {
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
}

注意 black 和 origin 值的类型不同,因为它们是不同的元组结构体的实例。你定义的每一个结构体有其自己的类型,即使结构体中的字段有着相同的类型。

结构体数据的所有权

相关文章

  • 5.1 - 结构体 - 定义并实例化结构体

    原文链接:https://kaisery.github.io/trpl-zh-cn/ch05-01-definin...

  • Rust 结构体

    使用结构体组织相关的数据 定义并实例化结构体 定义结构体需要使用struct关键字并为整个结构体提供一个名字。接着...

  • C语言基础掌握之day6

    结构体,联合体,枚举与typedef 结构体 定义结构体和初始化 访问结构体成员:实例化变量.成员变量 如:m....

  • Go 学习笔记 08 | 结构体详解

    一、结构体 实例化结构体 第一种实例化结构体:var 变量 结构体 输出: 结构体首字母可以大写也可以小写,大写表...

  • 结构体

    结构体有名定义 无名定义 结构体嵌套定义 结构体内存对齐 结构体成员初始化 结构体变量引用 结构体的有名定义:直白...

  • 你可能不知道的关于golang 的10件事情

    英文原文 匿名结构体 最常见的匿名用法,不用单独定义一个结构体类型 匿名结构体定义时并初始化 匿名结构体slice...

  • Go语言结构体存在的坑

    如果使用结构体嵌套在实例化的时候必须先实例化外层的结构体,然后在实例化内层的结构体

  • Go(结构体)

    五、结构体(struct) 5.1 定义 结构体是类型中带有成员的复合类型,结构体的定义格式: type可以将各种...

  • 结构体

    结构体定义格式 定义结构体变量 结构体初始化 结构体内存分析 定义结构体类型并不会分配存储空间 只有定义结构体变量...

  • C结构体和链表

    一,结构体变量定义及初始化 二,无名结构体 备注:无名结构体很少使用 三,宏定义结构体 四,结构体嵌套 五,结构体...

网友评论

    本文标题:5.1 - 结构体 - 定义并实例化结构体

    本文链接:https://www.haomeiwen.com/subject/xymbectx.html