RustStruct结构体详解

2022-11-13 18:11:18 结构 详解 RustStruct

Defining and Instanting 定义与实例化

使用struct关键字以定义结构体。

struct User {
	id: u64,
	name: String,
	email: String,
	active: bool,
}

使用let语句声明结构体的实例,使用mut指定可变性(必须全部可变或不可变,没有部分可变)

let user1 = User {
    id: 1u64,
    name: String::from("Zheng"),
    email: String::from("888888@outlook.com"),
    active: true,
};

使用.指定结构体成员,如user1.name

如果参数或变量与字段名同名,可以使用简化写法初始化变量

fn new_user(id: u64, name: String, email: String) -> User {
	User { 
		id, 
		name, 
		email, 
		active: true 
	}
}

使用结构体更新语法,可以基于已有实例的字段创建新实例

	let user3 = User {
		id: 3u64,
		..user2
	};

使用..[instant_name]语法,剩余字段将使用user2的字段

Attention: 结构体更新等同于变量赋值,将发生value move,源变量可能导致不可用

let user3 = User {
    id: 3u64,
    ..user2
};
println!("{:#?}", user3);
println!("user2: {:p}; user3: {:p}", &user2, &user3);

以上代码将会产生错误:borrow of a partially moved value。这是由于user2的部分变量(字符串String)被赋值给了user3,导致所有权发生转移,结构体整体(不包括未发生value move的字段)将不再可用。

使用元组结构体可定义匿名字段

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

注意,不同名的相同结构元组结构体将视为不同的类型,无法相互转换

使用空结构体,只实现trait,不需要存储任何数据时可以使用。

结构体数据的所有权:当一个结构体拥有其全部数据的所有权,则只要结构体有效,其数据就有效。如果存在对其他数据的引用,则需要使用生命周期支持。

Derived Traits派生trait

派生trait,指通过derive注解 derive attribute来派生的trait,可以为自定义类型添加许多功能。关于派生trait列表,详见附录C

这里使用Debug trait展示自定义结构体的成员信息。

#[derive(Debug)]
struct User {
	id: u64,
	name: String,
	email: String,
	active: bool,
}
fn main() {
    let user1 = User {
		id: 1u64,
		name: String::from("Zheng"),
		email: String::from("888888@outlook.com"),
		active: true,
	};
    println!("{:#?}", user1);
}
  • 以上代码会显示user1的全部字段信息
  • 也可以使用{:?},单行输出
  • 实际上,它调用了std::fmt::Display,这被包含在派生trait中。

Method 方法

方法是定义在结构体(或枚举类型enumtrait对象)的上下文中的类似函数的过程,第一个参数是self,用于指代调用方法的结构体实例。

Define

需要在impl块中定义方法,

#[derive(Debug)]
struct Rectangle {
	width: u32,
	height: u32,
}
impl Rectangle {
	fn area(&self) -> u32 {
		self.width * self.height
	}
}
fn main() {
	let rect1 = Rectangle {
		width: 30,
		height: 20,
	};
	println!("Size of {:?} is {}", rect1, rect1.area());
}
  • self参数自动拥有impl的结构体类型,不需要另行指定
  • self参数同样拥有可变引用和直接获取所有权
  • 除了方法必须在impl块中,以及第一个参数名必须为self以外,其余与函数相同
  • 可以使用多个impl块来定义方法、关联函数,在泛型和trait中有应用价值

自动引用与解引用

在方法调用中,Rust支持自动引用与解引用,使调用者匹配方法的签名,如添加& &mut *等。

Associated function 关联函数

之前已经提到过,还有不需要接收实例参数的关联函数。因为其不做用于某个结构体实例,所以称其为函数。使用::来使用关联函数。

到此这篇关于Rust Struct结构体详解的文章就介绍到这了,更多相关Rust Struct内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关文章