Rust 中的结构体(struct)
结构体的定义
实例化结构体时,必须为结构体中的每一个字段都进行赋值,但是可以不按照字段定义时的顺序进行赋值
一旦结构体的实例是可变的,那么实例中的所有字段都是可变的
当字段名与字段值对应的变量名相同时,在初始化时可以使用简写
定义时,最后一个字段后可以添加逗号也可以不添加逗号,但推荐添加上
fn main() {
// 在使用 struct 进行实例化时,可以不按照定义时字段的顺序进行赋值
// 初始化时必须为每一个字段都进行赋值
let user = User{
name: String::from("Zhangsan"),
age: 18,
active: true
};
let user_name = user.name.as_str();
let user_age = user.age;
let user_active = user.active;
println!("user name: {}", user_name);
println!("user age: {}", user_age);
println!("user active: {}", user_active);
// 也可以通过对 struct 添加 #[derive(Debug)] 特性来打印 struct 信息
println!("{:?}", user);
}
#[derive(Debug)] // 添加该行注解可以通过 println!("{:?}", user) 进行便捷打印
struct User{
name: String,
age: i32,
active: bool,
}
/* 输出:
user name: Zhangsan
user age: 18
user active: true
User { name: "Zhangsan", age: 18, active: true }
*/
使用简写定义
fn main() {
let user = build_user(String::from("Zhangsan"), 18, true);
println!("user name: {}", user.name);
println!("user age: {}", user.age);
println!("user active: {}", user.active);
}
struct User{
name: String,
age: i32,
active: bool,
}
fn build_user(name: String, age: i32, active: bool) -> User {
User{
name,
age,
active,
}
}
/* 输出:
user name: Zhangsan
user age: 18
user active: true
*/
结构体的更新语法
使用一个已有结构体来实例化另一个结构体
fn main() {
let user = build_user(String::from("Zhangsan"), 18, true);
let user2 = User {
name: String::from("Lisi"),
..user
};
println!("user name: {}", user.name);
println!("user2 name: {}", user2.name);
println!("user2 age: {}", user.age);
println!("user2 active: {}", user2.active);
}
struct User{
name: String,
age: i32,
active: bool,
}
fn build_user(name: String, age: i32, active: bool) -> User {
User{
name,
age,
active,
}
}
/* 输出:
user name: Zhangsan
user2 name: Lisi
user2 age: 18
user2 active: true
*/
元组结构体
需要注意的是,通过元组结构体实例化出来的不同的对象,类型也不相同
fn main() {
let black = Color(0, 0, 0);
let white = Color(255, 255, 255);
println!("black: {}, {}, {}", black.0, black.1, black.2);
println!("white: {}, {}, {}", white.0, white.1, white.2);
}
struct Color(i32, i32 ,i32);
/* 输出:
black: 0, 0, 0
white: 255, 255, 255
*/
结构体方法
通过在
impl 结构体名字 {}
中定义结构体的方法结构体方法的第一个参数是
self, &self 或 &mut self
实例化对象本身的引用通过实例.方法名的方式来调用结构体方法
Rust 没有
->
运算发,因为rust会自动引用或解引用允许使用多个
impl
来定义结构体方法或关联函数
fn main() {
let user = User {
name: String::from("Zhangsan"),
age: 18,
active: true,
};
user.info();
}
struct User {
name: String,
age: i32,
active: bool,
}
impl User {
fn info(&self) {
println!("name: {}, age: {}, active: {}", self.name, self.age, self.active);
}
}
关联函数
关联函数通常用来作为构造器来构造一个实例化的对象
关联函数的第一个参数不是self
通过
结构体名::函数名
的方式来调用关联函数
fn main() {
let user = User::build(String::from("Zhangsan"), 18, true);
user.info();
}
struct User {
name: String,
age: i32,
active: bool,
}
impl User {
fn build(name: String, age: i32, active: bool) -> User {
User {
name,
age,
active,
}
}
fn info(&self) {
println!("name: {}, age: {}, active: {}", self.name, self.age, self.active);
}
}
评论区