Rust语言

关注公众号 jb51net

关闭
首页 > 软件编程 > Rust语言 > Rust Struct

Rust Struct结构体详解

作者:Zheng__Huang

结构体,是一种自定义数据类型,允许程序员将不同类型的数据结合起来,形成相关联的整体。Rust的结构体还提供方法和关联函数,可以指定那些与结构体数据相关的行为

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);
}

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());
}

自动引用与解引用

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

Associated function 关联函数

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

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

您可能感兴趣的文章:
阅读全文