热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

11_Rust中的结构体

Rust中的结构体因为学Rust的同学基本都是从CC过来的,所以对于Rust中的结构体就不用讲得太细了,因为基础内容都是差不多的,只是有




Rust中的结构体

因为学Rust的同学基本都是从C/C++过来的,所以对于Rust中的结构体就不用讲得太细了,因为基础内容都是差不多的,只是有一些地方会有小小的区别。

在前面数据类型的时候介绍过元组,在C++的泛型那块也有元组的出现,如果要追溯到C语言的层次的话,结构体才是复杂数据类型的鼻祖。在复杂数据类型这块,一切都是从C开始演化过来的,包括像C++的类,Java的类也是从C语言的结构体开始。到了Rust中,结构体的样子也是差不多的,语法上比较贴近C语言,因为它把成员函数(在Rust中称为关联函数或方法,这些叫法不重要,重要的是它所表达的意思)这些都通通放到impl中,从struct关键字开始看,有股浓浓的C语言的味道。


结构体的声明

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

对应C语言的风格

struct User {
//C语言中没有bool和String,但是知道类型是放在前面这个意思就行了
bool active,
String username,
String email,
unsigned long sign_in_count
}; //C语言中,这里分号是不能漏的

结构体的访问也是采用 ‘.’ 加成员的方式访问。

struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
fn main() {
let cukor = User { //Rust的结构体初始化也挺别致的
active: true,
username: String::from("Cukor"),
email: String::from("123456@qq.com"),
sign_in_count: 886,
};
if cukor.active {
println!("{}上线了", cukor.username);
} else {
println!("{}不在线,请在{}留言", cukor.username, cukor.email);
}
}

当参数赋值给结构体成员同名时可以简写,例如:

fn build_user(email: String, username: String) -> User {
User {
email,
username,
active: true,
sign_in_count: 1,
}
}
//等价于以下代码
fn build_user(email: String, username: String) -> User {
User {
email: email,
username: username,
active: true,
sign_in_count: 1,
}
}

也可以通过其他结构体对象初始化当前结构体对象。

fn main() {
// --snip--
let user2 = User {
active: user1.active,
username: user1.username,
email: String::from("another@example.com"),
sign_in_count: user1.sign_in_count,
};
}

Rust提供了.. 语法,其作用是指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值。

fn main() {
// --snip--
let user2 = User {
email: String::from("another@example.com"),
..user1
};
}
//等效于
fn main() {
// --snip--
let user2 = User {
email: String::from("another@example.com"),
username: user1.username,
active: user1.active,
sign_in_count: user1.sign_in_count,
};
}


请注意,结构更新语法就像带有 = 的赋值,因为它移动了数据,就像我们在“变量与数据交互的方式(一):移动”部分讲到的一样。在这个例子中,我们在创建 user2 后不能再使用 user1,因为 user1username 字段中的 String 被移到 user2 中。如果我们给 user2emailusername 都赋予新的 String 值,从而只使用 user1activesign_in_count 值,那么 user1 在创建 user2 后仍然有效。activesign_in_count 的类型是实现 Copy trait 的类型,所以我们在“变量与数据交互的方式(二):克隆” 部分讨论的行为同样适用。



使用没有命名字段的元组结构体来创建不同的类型

这种结构体称之为:元组结构体。

元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型。

当你想给整个元组取一个名字,并使元组成为与其他元组不同的类型时,元组结构体是很有用的,这时像常规结构体那样为每个字段命名就显得多余和形式化了。

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
}

元组结构体就是可是省略成员名的结构体操作,像以上的Color,都知道它是由三种原基色构成(red, green, blue),使用元组结构体就可以减少red等这些的名字,因为我们早就已经习惯他们了。包括point也是,我们都知道是x,y,z轴。


没有任何字段的类单元结构体

我们也可以定义一个没有任何字段的结构体!它们被称为 类单元结构体(unit-like structs)因为它们类似于 (),即“元组类型”一节中提到的 unit 类型。类单元结构体常常在你想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用。

struct AlwaysEqual;
fn main() {
let subject = AlwaysEqual;
}

要定义 AlwaysEqual,我们使用 struct 关键字,我们想要的名称,然后是一个分号。不需要花括号或圆括号!然后,我们可以以类似的方式在 subject 变量中获得 AlwaysEqual 的实例:使用我们定义的名称,不需要任何花括号或圆括号。想象一下,我们将实现这个类型的行为,即每个实例始终等于每一个其他类型的实例,也许是为了获得一个已知的结果以便进行测试。我们不需要任何数据来实现这种行为,你将在第十章中,看到如何定义特性并在任何类型上实现它们,包括类单元结构体。

官方文档:

结构体的定义和实例化 - Rust 程序设计语言 简体中文版 (kaisery.github.io).







推荐阅读
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • gitlab重置password
    ruby没怎么学,自己搭建的gitlab的rootpassword又忘了。幸好看见此帖子,试验okhttp:roland.kierkels.netgitreset-your-git ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • C语言的经典程序有哪些
    本篇内容介绍了“C语言的经典程序有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何 ... [详细]
author-avatar
手机用户2702934194
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有