结构体(struct)
是将一组自定义的数据类型命名,并打包为一个整体。
介绍
struct 结构体名称 {
属性1: 类型, // 字段
属性2: 类型,
}
struct City {
name: String,
no: String,
age: u32,
}
fn main() {
let mut city = City {
no: String::from("021"),
name: String::from("shanghai"),
age: 10,
};
println!("name: {}, no: {}, age: {}", city.name, city.no, city.age);
city.age += 1;
println!("name: {}, no: {}, age: {}", city.name, city.no, city.age);
let city = new_city(String::from("shanghai"), String::from("021"), 10);
println!("name: {}, no: {}, age: {}", city.name, city.no, city.age);
// struct 更新
let city2 = City {
name: String::from("moudu"),
..city
};
println!("name: {}, no: {}, age: {}", city2.name, city2.no, city2.age);
}
// 初始化简写示例
fn new_city(name: String, no: String, age: u32) -> City {
City {
no, // 简写:初始化字段 no 为变量 no 的值,下同
name,
age: age, // 非简写
}
}
tuple struct
- 定义:使用 struct 关键字,后面跟名字,并在小括号中指定类型,如下:
struct 结构体名称(类型1, 类型2, 类型3);
struct Color(u32, u32, u32);
fn main() {
let black = Color(0, 0, 0);
println!("{}", black.0)
}
Unit-Like Struct
- 定义:
Unit-Like Struct
是在 Rust 中定义的没有任何字段的 struct - 使用场景:适用于需要在某个类型上实现某个 trait,但里面不需要存储数据
struct 方法
struct 方法和函数类似,由 fn
声明、函数名称、参数、返回值组成
- 在
impl
块里定义方法,一个 struct 可以有多个 impl
块 - struct 方法的第一个参数是
&self
,也可以获得其所有权和可变借用 - 结构体实例使用
.
方法调用方法
struct 结构体名称 {
属性1: 类型, // 字段
属性2: 类型,
}
impl 结构体名称 {
fn 函数名(&self) -> 返回值 { //self 为结构体示例
// fn 函数名(&mut self) -> 返回值 {
// 实现
self.属性1
}
}
struct 方法
vs 函数:
struct 方法
在 struct(或 enum、trait 对象)
的上下文中定义struct 方法
的第一个参数是 self
,表示方法被调用的 struct 示例
示例:
struct City {
name: String,
no: String,
age: u32,
}
impl City {
fn display(&self) {
println!("name: {}, no: {}, age: {}", self.name, self.no, self.age)
}
}
fn main() {
let city = City {
no: String::from("021"),
name: String::from("shanghai"),
age: 10,
};
city.display();
}
方法调用的运算符
传统的 C/C++
中,point_obj->somefun()
和 (*point_obj).somefun()
功能一样,但Rust没有 ->
运算符
Rust(和Golang一样)使用 .
调用方式时自动的引用和解引用,即 Rust 会根据情况自动添加 &
、&mut
、*
,以便实例可以匹配对方
- 下面的方法是相同的
p1.distance(&p2)
(&p1).distance(&p2)
- 与 Golang 略有区别(golang 结构体方法)
关联函数
关联函数
:在 impl
块里定义的函数,第一个参数不是 self
- 作用:通常用于构造器
- 调用:
结构体名称::函数名()
- 示例:
String::from()
#[derive(Debug)]
struct City {
name: String,
no: String,
age: u32,
}
impl City {
fn new(name: &str, no: &str, age: u32) -> City {
City {
name: String::from(name),
no: String::from(no),
age
}
}
}
fn main() {
let city = City::new("shanghai", "021", 10);
println!("{:?}", city)
}
pub struct
定义共有 Struct,pub struct
定义公有的 struct:
- struct 的字段默认是私有的
- struct 的字段前需要单独设置
pub
来变为公有的
pub struct City {
pub name: String,
pub no: String,
...
}