iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >RustStruct结构体详解
  • 190
分享到

RustStruct结构体详解

RustStructRustStruct结构体 2022-11-13 18:11:18 190人浏览 泡泡鱼
摘要

目录Defining and Instanting 定义与实例化Derived Traits派生traitMethod 方法自动引用与解引用Defining and Instanti

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: RustStruct结构体详解

本文链接: https://www.lsjlt.com/news/169179.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作