《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)

在Rust中,结构体(Struct)是一种自定义数据类型,它允许我们将多个相关的值组合在一起,形成一个更复杂的数据结构。结构体在Rust中被广泛应用于组织和管理数据,具有灵活性和强大的表达能力。本节将详细介绍Rust中结构体的概念、定义语法、方法以及相关特性,并提供代码示例来帮助读者更好地理解结构体的使用方法。

8.3.1 结构体的定义

Rust 中的结构体与元组都可以将若干类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它的成员的时候就不用记住下标了。元组常用于非定义的多值传递,而结构体用于规范常用的数据结构。结构体的每个成员叫作“字段”。

在Rust中,我们可以使用struct关键字定义一个结构体。结构体允许我们定义多个字段(Fields),每个字段都有自己的类型和名称。通过将字段组合在一起,可以创建自己的数据类型,以便更好地表示和操作数据。以下是一个简单的结构体定义的示例:

struct Point {
x: i32,
y: i32,
}

在上述示例中,我们定义了一个名为Point的结构体,它具有两个字段x和y,分别是i32类型的整数。再来看一个结构体定义:

struct Site {
domain: String,
name: String,
nation: String,
found: u32
}

注意:如果你常用C/C++,请记住在Rust中struct语句仅用来定义,不能声明实例,结尾不需要“;” 符号,而且每个字段定义之后用“,”分隔。

8.3.2 结构体实例化

一旦定义了结构体,可以通过实例化结构体来创建具体的对象。可以通过以下两种方式实例化结构体:

1)声明式实例化

let p = Point { x: 10, y: 20 };

在上述示例中,我们使用Point结构体的定义创建了一个名为p的实例,同时指定了字段x和y 的值。

2)可变实例化

如果需要修改结构体的字段值,可以在定义结构体变量时加上mut,代码如下:

let mut p = Point { x: 10, y: 20 };
p.x = 30;
p.y = 40;

在上述示例中,我们创建了一个可变实例p,并修改了字段x和y的值。

Rust很多地方受JavaScript的影响,在实例化结构体的时候用JSON对象的key: value语法来实现,比如:

let mysite = Site {
domain: String::from("www.qq.com"),
name: String::from("qq"),
nation: String::from("China"),
found: 2024
};

如果你不了解 JSON 对象,可以不用管它,记住格式就可以了:

结构体类名 {
字段名 : 字段值,
...
}

这样的好处是不仅使程序更加直观,还不需要按照定义的顺序来输入成员的值。如果正在实例化的结构体有字段名称和现存变量名称一样,可以简化书写:

let domain = String::from("www.qq.com");
let name = String::from("qq");
let runoob = Site {
domain, // 等同于 domain : domain,
name, // 等同于 name : name,
nation: String::from("China"),
traffic: 2024
};

有这样一种情况:想要新建一个结构体的实例,其中大部分属性需要被设置成与现存的一个结构体属性一样,仅需更改其中一两个字段的值,可以使用结构体更新语法:

let site = Site {
domain: String::from("www.qq.com"),
name: String::from("qq"),
..qq
};

注意:..qq后面不可以有逗号。这种语法不允许一成不变地复制另一个结构体实例,意思就是至少重新设定一个字段的值,才能引用其他实例的值。

8.3.3 结构体的方法
在Rust中,结构体可以拥有自己的方法。方法是与结构体关联的函数,可以通过结构体实例调用。以下是一个结构体方法的示例:

struct Rectangle {
width: u32,
height: u32,
} impl Rectangle { //使用关键字impl来定义结构体的一个或多个方法
fn area(&self) -> u32 { //用关键字fn定义具体的函数
self.width * self.height
}
} fn main() {
let rect = Rectangle { width: 10, height: 20 };
let area = rect.area();
println!("Area: {}", area);
}

在上述示例中,我们定义一个名为Rectangle的结构体,并为其实现一个area方法,用于计算矩形的面积。在main函数中,我们创建一个Rectangle实例rect,然后通过调用area方法计算矩形的面积并打印出来。

8.3.4 结构体的关联函数

除实例方法外,结构体还可以定义关联函数(Associated Functions)。关联函数是直接与结构体关联的函数,不需要通过结构体实例来调用。以下是一个关联函数的示例:

struct Circle {
radius: f64,
} impl Circle {
fn new(radius: f64) -> Circle {
Circle { radius }
} fn area(&self) -> f64 {
std::f64::consts::PI * self.radius * self.radius
}
} fn main() {
let circle = Circle::new(5.0);
let area = circle.area();
println!("Area: {}", area);
}

在上述示例中,我们定义一个名为Circle的结构体,并为其实现一个关联函数new,用于创建一个新的Circle实例。在main函数中,我们通过调用Circle::new关联函数创建一个Circle实例circle,然后通过调用area方法计算圆的面积并打印出来。

8.3.5 结构体的特性

Rust的结构体具有两个特性:元组结构体(Tuple Struct)和类单元结构体(Unit-Like Struct)。

元组结构体是一种特殊类型的结构体,它没有命名的字段,只有字段的类型。元组结构体使用圆括号而不是花括号来定义。比如:

struct Color(i32, i32, i32);

在上述示例中,我们定义了一个名为Color的元组结构体,它包含3个i32类型的字段。

类单元结构体是一种没有字段的结构体,类似于空元组。比如:

struct Empty;

在上述示例中,我们定义了一个名为Empty的类单元结构体。

Rust编程与项目实战-结构体的更多相关文章

  1. keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

    以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧! 后来学会了在keil里进行模块化编程,即只把功能相同或 ...

  2. 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

    一.关于全局变量的定义.声明.引用: (只要是在.h文件中定义的变量,然后在main.c中包含该.h文件,那么定义的变量就可以在main函数中作为全局变量使用) 方法1: 在某个c文件里定义全局变量后 ...

  3. [编程] C语言的结构体

    结构体 struct 结构体名{} 变量名; 结构体变量: struct person{ char *name; int age; float score; } student; 成员的获取和赋值 / ...

  4. Bash脚本编程学习笔记06:条件结构体

    简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...

  5. 结构体struct sockaddr_in, struct sockaddr,struct in_addr

    一.结构体 struct sockaddr_in,  struct sockaddr,  struct in_addr struct sockaddr_in,  struct sockaddr,str ...

  6. 3.11 Go Struct结构体

    3.11 Go Struct结构体 Golang支持OOP面向对象编程. Go的结构体struct如同python的class. Go基于struct实现OOP特性,只有组合composition这个 ...

  7. [C#.NET 拾遗补漏]14:使用结构体实现共用体

    在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的相关数据.在 C 语言中还有一种和结构体非常类似的语法,叫共用体(Union),有时也被直译为 ...

  8. 【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!

    前言 对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习 ...

  9. 【Spark】Day03-Spark SQL:DataFrame、DataSet、sql编程与转换、项目实战(区域热门商品)

    一.概述 1.介绍 将Spark SQL转换成RDD,然后提交到集群执行[对比hive] 提供2个编程抽象:DataFrame&DataSet 可以使用SQL和DatasetAPI与Spark ...

  10. 【Swift学习】Swift编程之旅---类和结构体(十三)

    与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类 ...

随机推荐

  1. 面试必问之kafka

    问题1:消息队列的作用 1. 解耦 快递小哥手上有很多快递需要送,他每次都需要先电话一一确认收货人是否有空.哪个时间段有空,然后再确定好送货的方案.这样完全依赖收货人了!如果快递一多,快递小哥估计的忙 ...

  2. 树莓派CM4(二): UART/IIC/SPI调试

    1. 参考资料 资料汇总页面 https://shumeipai.nxez.com/raspberry-pi-datasheets <bcm2711-peripherals.pdf>,下载 ...

  3. 【1】Kaggle赛题解读:RSNA 2024 Lumbar Spine Degenerative Classification

    赛题名称:RSNA 2024 Lumbar Spine Degenerative Classification 中文:腰椎退行性病变分类 kaggle官网赛题链接:https://www.kaggle ...

  4. 【Python爬虫】之爬取页面内容、图片以及用selenium爬取

    下面不做过多文字描述: 首先.安装必要的库 # 安装BeautifulSoup pip install beautifulsoup4 # 安装requests pip install requests ...

  5. 3d格式介绍之OBJ格式

    OBJ格式是一种用于3D模型的文件格式,全称为Wavefront OBJ.它由Wavefront Technologies公司开发,最初用于其高级视觉动画软件,但后来广泛应用于各种3D图形软件中. 本 ...

  6. 网络安全公开数据集Maple-IDS,恶意流量检测数据集开放使用!

    Maple Dataset 枫叶数据集Maple Dataset枫叶数据集由东北林业大学网络安全实验室(https://maple.nefu.edu.cn/lab/)公开发布,是用于入侵检测评估的数据 ...

  7. Could not resolve placeholder 'xxx.xxx.xxx' in value "http://${xxx.xxx.xxx}"

    代码一切正常,忽然报这个错误, 原因为,当前配置在配置文件最后,且前面均为注释,把当前配置位置提前即可

  8. Cookie的secure属性引起循环登录问题分析及解决方案

    作者:来自 vivo 互联网服务器团队- Wang Fei 单点登录作为公共组件,在各个公司内部被各个系统所广泛使用,但是在使用过程中我们会遇到各种各样的问题,其中循环登录问题就是一个比较经典的问题. ...

  9. vue源码解析-实现一个基础的MVVM框架

    基本介绍 vue.js采用数据劫持结合发布-订阅模式的方式,通过Object.defineProperty()来劫持各个属性的getter,setter,在数据变动时发布消息给订阅者,触发响应的监听回 ...

  10. Angular Material 18+ 高级教程 – Custom Themes for Material Design 2 (自定义主题 Material 2)

    v18 更新重要说明 从 Angular Material v18 开始,默认使用的是 Material 3 Design (简称 M3),本篇教的是旧版本的 Material 2 Design (简 ...