Rust之使用结构体来组织相关的数据

这篇具有很好参考价值的文章主要介绍了Rust之使用结构体来组织相关的数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

结构或结构体,是一种自定义数据类型,它允许我们命名多个相关的值并将它们组成一个有机的结合体。

1、定义并实例化结构体:

和元组一样,结构体中的数据可以拥有不同的类型,不同的是,结构体需要给每个数据赋予名字以便于清楚地表达它们的意义。
关键字struct被用来定义并命名结构体。一个良好的结构体名称应当能够反映出自身数据组合的意义。需要在随后的花括号中声明所有数据的名字及类型,这些数据也被称为字段。
示例:

struct User{
	username:String,
	email:String,
	sign_in_count:u64,
	active:bool,
}

在定义好结构体之后,需要为每个字段赋值来创建结构体实例,结构体实例赋值的顺序可以不按照所定义的顺序。
示例:

let User1 = User{
	email:String::from("xxxx@xx.com"),
	username:String::from("xxxx"),
	active:true,
	sign_in_count:1,
}

在创建好结构体实例之后,可以通过点号来访问实例中的特定的字段,例如需要访问User1中的名字,可以使用User1.username来获取。同样也可以通过点号来修改可变实例中相应的字段。
注:一旦实例可变,实例中所有的字段都是可变的,Rust不允许单独声明某一部分字段的可变性。

(1)、在变量名与字段名相同时使用简化版的字段初始化方法:

当函数的参数与结构体字段拥有完全一致的名称,可以使用名为字段初始化简写的语法来构建函数,这种语法并不会改变函数的行为。
示例:

fn build_user(email:String,username:String)->User{
	User{
		email,
		username,
		active:true,
		sign_in_count:1,
	}
}

(2)、使用结构体更新语法根据其他实例创建新实例:

许多新实例的创建,除了修改小部分的字段,其他部分与旧实例完全相同,就可以使用结构体更新语法来快速实现新实例的创建。
示例:

let User1 = User{
	email:String::from("xxxx@xx.com"),
	username:String::from("xxxx"),
	active:true,
	sign_in_count:1,
}
let User2 = User{
	email:String::from("xxxx@xx.com"),
	username:String::from("xxxx"),
	active:user1.active,
	sign_in_count:user1.sign_in_count,
}

为了简化代码量,可以使用更少的代码完成创建。
示例:

let User1 = User{
	email:String::from("xxxx@xx.com"),
	username:String::from("xxxx"),
	active:true,
	sign_in_count:1,
}
let User2 = User{
	email:String::from("xxxx@xx.com"),
	username:String::from("xxxx"),
	..user1
}

(3)、使用不需要对字段命名的元组结构来创建不同的类型:

元组结构体:使用一种类似于元组的方式来定义结构体。
元组结构体同样拥有用于表明自身含义的名称,但是无须在声明它时对其字段进行命名,仅保留字段的类型即可。当需要给元组赋予名字,并使其区别于其他拥有同样定义的元组时,可以使用元组结构体。
定义元组结构体时,依旧使用struct关键字开头,并由结构体名称及元组中的类型定义组成。
示例:

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

let black = Color(0,0,0);
let origin = Point(0,0,0);

(4)、没有任何字段的空结构体:

Rust允许创建没有任何字段的结构体。因为这种结构体与空元组十分相似,也被称为空结构体。当要在某些类型上实现一个trait,但是不需要该类型储存任何数据时,可以使用空结构体。

2、方法:

方法与函数十分相似:都是用fn关键字以及一个名称来进行声明;都可以拥有参数和返回值;都包含了一段在调试时执行的代码。但是方法和函数是两个不同的概念,因为方法总是被定义在某个结构体(或者枚举类型、trait对象)的上下文中,并且它们的第一个参数永远是self,用于指代调用该方法的结构体实例。

(1)、定义方法:

示例:

#[derive(Debug)]
struct Rectangle{
	width:u32,
	height:u32,
}
fn main(){
	let rect1 = Rectangle{width:30,height:50};
	println!("rect1 is {:?}",rect1);
	println!("The area of the rectangle is {} square pixels.",area(&rect1));
}
fn area(rectangle:&Rectangle) -> u32{
	rectangle.width*rectangle.height
}

使用方法进行改写:

#[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:50};
	println!("rect1 is {:?}",rect1);
	println!("The area of the rectangle is {} square pixels.",rect1.area());
}

为了在Rectangle的上下文环境中定义这个函数,需要将area函数移动到一个由impl关键字起始的代码块中,并把签名中的第一个参数和函数中使用该参数的地方改写成self。此外,还需要把main函数中调用area函数的地方,用方法调用的语法进行改写。方法调用是通过在实例后面加上点号,并跟上方法名、括号及可能的参数来实现的。

(2)、关联函数:

除了方法外,Rust还允许定义不用接收self作为参数的函数。由于这类函数与结构体相互关联,故称之为关联函数。
关联函数常常被用作构造器来返回一个结构体的新实例。例如,可以编写一个接收一维参数的关联函数,它会将输入的参数同时作用长度与宽度来构造正方形的Rectangle实例。
示例:

impl Rectangle{
	fn square(size:u32) -> Rectangle{
		Rectangle{width:size,height:size}
	}
}

在类型名称后面添加::来调用关联函数,例如let sq = Rectangle::square(3);文章来源地址https://www.toymoban.com/news/detail-605887.html

到了这里,关于Rust之使用结构体来组织相关的数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 第六章 包图组织模型|系统建模语言SysML实用指南学习

    第六章 包图组织模型|系统建模语言SysML实用指南学习

    仅供个人学习记录 包是容器的一个例子。包中的模型元素称为可封装元素,这些元素可以是包、用例和活动。由于包本身也是可封装元素,因此可以支持包层级。 每个有名称的模型元素也必须是命名空间的一份子,命名空间使得每个元素均能够通过名称被唯一识别。 有效的

    2024年02月05日
    浏览(10)
  • 05-使用结构体构建相关数据

    上一篇: 04-了解所有权         结构体(struct)是一种自定义数据类型,可以将多个相关值打包命名,组成一个有意义的组。如果你熟悉面向对象的语言,那么结构体就像是对象的数据属性。在本章中,我们将对元组和结构体进行对比,在已有知识的基础上说明结构体是

    2024年01月24日
    浏览(9)
  • 【学习笔记】数据结构算法文档(类C语言)

    1.1.1 线性表的顺序存储表示 1.1.2 顺序表中基本操作的实现 1.1.2.1 初始化 1.1.2.2 取值 1.1.2.3 查找 1.1.2.4 插入 1.1.2.5 删除 1.1.2.6 计数 1.2.1 单链表的定义和表示 ★ 关于结点 1.2.2 单链表基本操作的实现 1.2.2.1 初始化 1.2.2.2 取值 1.2.2.3 查找 1.2.2.4 插入 1.2.2.5 删除 1.2.2.6 前插法创建单

    2024年02月07日
    浏览(25)
  • 一、课程设计目的与任务《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以

    一、课程设计目的与任务 《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据的逻辑结构和存储结构以及相应

    2024年02月21日
    浏览(47)
  • 数据结构学习——C语言对栈的基本操作

    数据结构学习——C语言对栈的基本操作

             栈(Stack)是一种常用的数据结构,遵循先进后出(LIFO)的原则,对表尾进行操作,常用于临时存储和撤销等操作,其基本操作包括栈的创建、入栈(也叫压栈Push)、出栈(又称弹栈)、栈的遍历、栈的清空(clear)、栈的销毁(destroy)等。         栈的创建有两种方式,一种是通

    2024年02月07日
    浏览(16)
  • CTP:关于cc和bindgen库及rust工程组织

    CTP:关于cc和bindgen库及rust工程组织

    有三个工程目录,cpt-api, ctp-sdk,ctp-strategy 1、ctp-sdk: 主要的目的是基于bindgen库生成与cpp的.h文件相对应一个binding.rs文件,后面供策略使用。 在这个目录下,建一个build.rs,用bindgen库生成cpp.h的头文件相应的rust绑定文件,生成的文件放在ctp-api目录下 相应的buildr.s 这里去除了t

    2024年02月08日
    浏览(3)
  • 【Rust】Rust学习 第十三章Rust 中的函数式语言功能:迭代器与闭包

    【Rust】Rust学习 第十三章Rust 中的函数式语言功能:迭代器与闭包

    Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是  函数式编程 ( functional programming )。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。 更具体的,我们将要涉及: 闭包 ( Closures ),一个可以储

    2024年02月12日
    浏览(13)
  • Rust 程序设计语言学习——基础语法

    Rust 程序设计语言学习——基础语法

    Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言。 Rust 语言由 Mozilla 开发,最早发布于 2014 年 9 月。Rust 的编译器是在 MIT License 和 Apache License 2.0 双重协议声明下的免费开源软

    2024年01月22日
    浏览(15)
  • 数据结构(c++语言版) 邓俊辉 第五章:二叉树学习笔记

    数据结构(c++语言版) 邓俊辉 第五章:二叉树学习笔记

    5.1二叉树及其表示         树是由节点和边组成的。 1.有根树         树是由顶点(vertex)和边(edge)组成。树的每个顶点也叫节点(node)。 2.深度与层次         由树的连通性,每一节点与根都有一条路径相连:根据树的无环性,由根通往每个节点的路径必然唯一。  

    2024年02月13日
    浏览(9)
  • 【C++】引用之带你“消除”C语言版数据结构教材的一些困惑(虽然是C++的内容,但是强烈建议正在学习数据结构的同学点进来看看)

    【C++】引用之带你“消除”C语言版数据结构教材的一些困惑(虽然是C++的内容,但是强烈建议正在学习数据结构的同学点进来看看)

    👀樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 引用的概念 引用的特性 引用的使用场景 引用和指针的区别 C语言版数据结构教材的解惑 不知道

    2024年02月08日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包