元组与结构体之间存在关联:都可以存储不同类型的数据;但结构体比元组访问数据更灵活。
结构体与枚举可以创建新类型,新类型可以享受Rust编译时类型检查系统的所有优势。
结构体定义:
1. 定义结构体类似TS里的接口定义:
关键字:struct
属性名:属性值类型
2. 实例化:
a. 如果属性名和赋值变量名相同,可以采用简单写法。
{
email,
username,
}
b.根据其他实例创建新实例
let user2 = User {
email: String::from("xxxx@example.com"),
username: String::from("xxxx"),
..user1
};
3. 元组结构体:
元组结构体实例的行为就像元组一样:你可以通过模式匹配将它们解构为单独的部分,你也可以通过. 及索引来访问特定字段
4. 空结构体:
结构体与空元组()十分相似,所以它们也被称为空结构体
结构体与所有权:
1. 结构体拥有全部自身全部数据的所有权,只要结构体有效,那么它所携带的所有数据都有效。
2. 在结构体中存储其他数据的引用,需要用到生命周期。生命周期能够保证结构体中的数据有效期不短于实例本身。
结构体与Trait
Rust没有为结构体提供默认的Display实现。
println!("rect1 is {:?}, rect1);。我们把标识符号:?放入了花括号中,它会告知println!当前的结构体需要使用名为Debug的格式化输出。Debug是另外一种格式化trait,它可以让我们在调试代码时以一种对开发者友好的形式打印出结构体。
结构体继承Debug Trait :
derive: 起源于;衍生
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
结构体方法定义:
关键字impl(implementation),表示实现的意思,用于定义结构体的函数
self关键字:表示当前结构体。Rust能够将self的类型推导为Rectangle
#[derive(Debug)]
struct Rectangle{
width:u32,
height:u32,
}
impl Rectangle{
fn area(&self) -> u32{
self.width * self.height
}
}
这里使用的是&self,是Rectangle的借用。将第一个参数标记为self并在调用过程中取得实例的所有权的方法并不常见。
object.something()调用方法时,Rust会自动为调用者object添加&、&mut或*,以使其能够符合方法的签名:
fn main(){
let rect1 = Rectangle{
width:30,
height:50,
};
println!("The area of the rectangle is {} square pixels.",rect1.area());
}
自动引用行为之所以能够行得通,是因为方法有一个明确的作用对象:self的类型。在给出调用者和方法名的前提下,Rust可以准确地推导出方法是否是只读的(&self),是否需要修改数据(&mut self),是否会获取数据的所有权(self)。这种针对方法调用者的隐式借用在实践中可以让所有权系统更加友好且易于使用。
关联函数:
impl块还允许我们定义不用接收self作为参数的函数 。这类函数与结构体相互关联,所以它们也被称为关联函数(associated function)。(这里用的是“函数”,区别impl块里的其他“方法”)。不会他们不会作用于某个具体的结构体实例。关联函数常常被用作构造器来返回一个结构体的新实例。
注意:::语法不仅被用于关联函数,还被用于模块创建的命名空间。