使用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 值并返回整个结构体
当字段名与字段值对应变量名相同时,可以使用字段初始化简写
fn build_user(email: String, username: String) -> User { User { email, //因为email字段与email参数有相同的名称 username, //同上 active: true, sign_in_count: 1, }
通过一个结构体实例创建一个新实例,其中新实例中大部分值与旧实例的值相同,其他一部分值与旧实例不同
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 };
元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型
整体有名字,里面的元素没有名字
想给整个元组取一个名字,并使元组成为与其他元组不同的类型时
定义时:以 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); }
需要注意的是, black
和 origin
值的类型不同,是不同元组结构体的实例;自己定义的每一个结构体都有自己的类型,即使结构体中的字段有着相同的类型
元组结构体类似元组:可以将其解构为单独的部分,也可以使用 .
后跟索引来访问单独的值
即一个没有任何字段的结构体
类似单元类型(即没有值的元组类型)
适用:想要在某个类型上实现 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
)
struct User { active: bool, username: &str, //这里字段使用的是引用 email: &str, sign_in_count: u64, }
该代码不能正常编译