Rust语法:变量,函数,控制流,struct
文章目录
- 变量
- 可变与不可变变量
- 变量与常量
- 变量的Shadowing
- 标量类型
- 整数
- 复合类型
- 函数
- 控制流
- if else
- loop & while
- for in
- struct
- struct的定义
- Tuple Struct
- struct的方法与函数
变量
可变与不可变变量
Rust中使用let来声明变量,但是let声明的是不可变变量,如果想要可变,则需要加上mut关键字
fn main(){let x = 10;x = x + 1; //报错,因为x是不可变类型let mut y = 11;y = y + 1; //可行
}
变量与常量
常量与不可变变量一样都是不能被修改的,但是他与不可变变量有很多区别。
- 常量用const声明,且必须标注其类型
- 常量不能加mut修饰
- 常量可以在任何作用域内声明(包括全局)
- 常量只可以绑定在常量表达式中,无法绑定在函数的调用结果或者只能在运行时才能计算出的值。
- 在场许运行期间,长廊在其作用域内一直有效。
常量命名规范:全大写字母+下划线分割(不符合规范rust编译器会警告)
const MAX_POINT = 10000;
fn main(){
}
变量的Shadowing
Rust允许用户在一个作用域内重复的声明一个同名变量,并且可以是不同的类型的,而后声明的变量会覆盖前面声明的变量,这叫做变量的shadowing
fn main(){let x = 100;let x = "Test"; // 此时在对x进行操作,x的值就是"Test"let number = "123123";let number = number.trim().parse(); //转化为数字//上述shadowing就使得通用一个number的变量名,但是却做到了类型转换。
}
标量类型
Rust是一个强类型的静态语言,这意味着在编译时编译器就需要明确的知道每个变量的类型,而不是像Py一样,“变量的类型是动态可变的”。
而上述的代码没有指定类型,只使用了let,是因为Rust的编译器可以自行推断出变量的类型(根据返回值,上下文,调用情况)。而有时情况过于复杂时便无法推断,便需要使用者自行标注出类型。
整数
整数类型如下:

可以看到分类无符号和有符号类型,并且每个类型都标清楚了占多少字节,最后一个isize类型表示的是CPU位数长度的整数类型(一个机器字长),与电脑硬件有关。
如下面代码所示,在变量后面加冒号在家类型就可以强制显示的的表明变量的类型。
fn main(){let x: i8 = 18;let y: u32 = 100;
}

整数字面值如上:
Rust允许在数字之间加下划线用于增加可读性。其中十六进制以0x开头,八进制以0o开头,二进制以0b开头。
而字节类型需要在字符串前加一个b。
Rust允许在数值后面加上类型来标注这个数字的类型
fn main(){let x = 1002u32let y = 10010010i32let z = 0b100100let a = 0xffa0let b = b'B'
}

Rust的int默认值是32,浮点数默认值是64Bytes。如果整数类型发生了溢出,那么程序就会panic,如果在发布模式下编译则不会检查溢出。Rust的溢出会进行环绕操作,即对可取的最大值取余。

布尔类型则是有两个值,一个是true,一个是false占两个字节
fn main(){let x: bool = true;
}
字符类型用来描述语言中最基础的单个字符,占四个字节,使用的值是Unicode表值。
fn main(){let x: char = '你';let u: char = '🙂';
}
复合类型
Rust提供了两种复合类型,一个是Tuple,一种是数组。
Tuple的创建遵循以下规则:

fn main(){let x: (i32, char, f32) = (2003, 'a', 0.3);println!("{} {} {}", x.0, x.1, x.2);
}
对于元组可以使用点+索引的形式来得到元素,元组是定长的,你可以认为它类似于C的struct的简化版。
元组还可以进行拆包,其过程如下:
fn main(){let x: (i32, char, f32) = (2003, 'a', 0.3);let (a, b, c ) = x;
}
另一个数据类型,数组则是定长,且使用[]来进行定义和创建
fn main(){let x: [i32; 5] = [1, 2, 3, 4, 5]; // 创建一个i32类型,长度为5的数组let y = [5; 4];// 创建4个i32类型值为5,长度为4的数组let z = ["xxx", "yyy"]; //创建两个str类型的数组
}
上述需要注意的是let y = [5; 4];这种写法相当于是创建一个重复为5,长度为4的数组
函数
rust的函数的格式为:
fn 函数名(参数: 类型) -> 返回值{函数体;
}
fn main(){let x = test();
}fn test(){println!("Test");
}
上述的test的返回值是()。
fn main(){let _x = test(32);
}fn test(number: i32) -> (){println!("Test number is {}", number);
}
Rust的函数体由Statement和Expression来构成,其中Statement指的是像let x = 10;这类的语句,而Expression则是x + 3, x == 5这样具有返回值的表达式。
Rust默认最后一个表达式即为返回值(或者函数题的值),如果没有则默认值为()
fn main(){let x = test(10);println!("Test number is {}", x);
}fn test(number: i32) -> i32{5 + number //注意,5 + number后面没有分号,否则将会被视为一个语句
}
这个函数体还可以作为变量的值来传递
fn main(){let x = {let mut _y = 11;_y * 3};println!("{}", x)
}
上述x的的值是33,如果函数体最后一个语句没有返回值,则会得到()
控制流
与Rust控制流相关的有loop,while,for in的循环语句和if else,match的判断语句。其中match涉及到枚举不在这里记录,放在枚举那里。
if else
if和else就类似于C语言,当只有一个单独的语句时可以不用最外层的括号
fn main(){let x = 10;if x > 5 {println!("大于5");}else if x == 5 {println!("小于5");}else {println!("小于5");}
}
三元运算符,有点类似于python与C的结合体,例子如下
if 条件 {结果1} else {结果2}
fn main(){let x = if 5 > 3 {5} else {3};println!("x is {}", x);let y = if x != 5 {x * 2}else{x - 3};println!("y is {}", y);
}
/*Compiling hello_world v0.1.0 (E:\RustProject\Hello_World)Finished dev [unoptimized + debuginfo] target(s) in 0.69sRunning `target\debug\hello_world.exe`
x is 5
y is 2
*/
loop & while
loop的用法就是相当于while true,也就是loop内的语句会被不停地循环,直到遇到break为止。
用法如下:
fn main(){let mut x = 0;loop{x += 1;if x > 10{break;}}println!("x is {}", x);
}
而对于while循环则是和C和Py一样,break和continue语句也是同样的道理。
while 条件{}
fn main(){let mut x = 0;while x <= 10 {x += 1;}println!("x is {}", x);
}
for in
for in则是类似于py的for in集合的模式,in后面需要跟一个可以迭代的类型例如数组。
需要注意的是此时tmp是&i32类型,也就是说它的类型是确定的,没法for in一个多种类型的Tuple。
fn main(){let x = [3, 4, 5, 6];for tmp in x.iter(){ //iter方法得到x的迭代器println!("{}", tmp);}
}
/*Compiling hello_world v0.1.0 (E:\RustProject\Hello_World)Finished dev [unoptimized + debuginfo] target(s) in 1.07sRunning `target\debug\hello_world.exe`
3
4
5
6
*/
对于计数之类的需求,Rust提供了Range的方法,可以使用a…b来构造一个a+1,a+2…, b-2, b-1的序列来进行遍历,如下:
fn main(){for x in 3..10{println!("{}", x);}
}
/*Compiling hello_world v0.1.0 (E:\RustProject\Hello_World)Finished dev [unoptimized + debuginfo] target(s) in 1.03sRunning `target\debug\hello_world.exe`
3
4
5
6
7
8
9
*/
struct
struct的定义
Rust的struct定义如下:
struct 名称{
变量1: 类型,
变量2: 类型…
}
struct Rectangle{width: u32,length: u32
}
而struct的初始化则是使用名字+变量名:值的形式初始化,注意,struct不允许有字段为空值,也就是说需要全部值都初始化
let re = Rectangle{width: 10,length: 19};
而这些值的访问就类似于C的struct,直接用点+对应的字段即可。
struct也可以设置为mut,而对于struct来说,一旦设置为mut,则里面每个值都必须要是mut,也就是说都是可变的。
let mut re = Rectangle{width: 10,length: 19};re.width = 100;
当有变量名与struct内部定义的变量名同名时,可以省去冒号进行初始化
struct Rectangle{width: u32,length: u32
}fn main(){let width = 9;let mut re = Rectangle{width, // 省去了冒号,因为width同名length: 19};
}
当想要对struct进行更新时,有一种简单的简写操作,如下:
let width = 9;let mut re = Rectangle{width, length: 19};let re2 = Rectangle{width: 100,..re //re表示,剩下的字段的值与re的剩余字段的值相同};
Tuple Struct

struct的方法与函数
对于一个struct,它拥有对应的方法和函数,而对于方法则是应用于struct的上下文中的,可以获取和修改具体的struct的值。而函数则不能,他只是与某种struct关联到了一起而已。
使用impel关键字来为struct绑定方法和函数。
第一个参数带有self关键字就是方法,而不带有则是函数
struct Rectancle{width: u32,length: u32,
}impl Rectancle {//为Rectangle绑定函数和方法fn area(&self) -> u32{//绑定一个方法&self表示Rectangle结构体本身self.width * self.length //返回面积}
}fn main(){let y = Rectancle{width: 10,length: 15};println!("Area is {}", y.area());
}
下面是绑定一个函数例子
struct Rectancle{width: u32,length: u32,
}impl Rectancle {fn area(&self) -> u32{self.width * self.length}fn make_square(size: u32) -> Rectancle { //构造一个正方形Rectancle { width: (size), length: (size) }}
}fn main(){let sq = Rectancle:: make_square(10);//通过使用::的方式来调用函数println!("Area is {}", sq.area());
}
需要注意,每个struct允许拥有多个impel的模块。
相关文章:
Rust语法:变量,函数,控制流,struct
文章目录 变量可变与不可变变量变量与常量变量的Shadowing标量类型整数 复合类型 函数控制流if elseloop & whilefor in structstruct的定义Tuple Structstruct的方法与函数 变量 可变与不可变变量 Rust中使用let来声明变量,但是let声明的是不可变变量&#x…...
LVS简介及LVS-DR搭建
目录 一. LVS简介: 1.简介 2. LVS工作模式: 3. LVS调度算法: 4. LVS-DR集群介绍: 二.LVS-DR搭建 1.RS配置 1)两台RS,需要下载好httpd软件并准备好配置文件 2)添加虚拟IP(vip&…...
Java基础篇--日期时间类
目录 前言 Instant(时间戳)类 LocalData(日期)类 LocalTime(时间)类 LocalDataTime(日期时间)类 Duration(时间间隔)类 Period(日期间隔)类 Clock(获取时区)类 前言 在开发中经常需要处理日期和时间,Java提供…...
Vue生命周期函数 详解
以下是Vue生命周期函数的流程图和每个周期的代码详解: 流程图: beforeCreate -> created -> beforeMount -> mounted -> beforeUpdate -> updated -> beforeDestroy -> destroyed详解: beforeCreate: 触发时…...
判断链表有环的证明
目录 1.问题 2.证明 3.代码实现 1.问题 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用…...
百度屏蔽词有哪些?其中就有移民关键词指数被屏蔽?
我是百收网SEO,点点上面的头像,欢迎关注我哦! 今日tombkeeper消息爆料:百度指数已经屏蔽“移民”等关键词指数。 大家好,我是百收网SEO商学院的狂潮微课老师,今天我们来讲解第 12 节课关键词优化难度分析…...
代码随想录day02
977.有序数组的平方 ● 力扣题目链接 ● 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 思路 ● 暴力排序,时间复杂度O(n nlogn) ● 使用双指针,时间复杂度O(n) …...
VR时代真的到来了?
业界对苹果的期待是,打造一台真正颠覆性的,给头显设备奠定发展逻辑底座的产品,而实际上,苹果只是发布了一台更强大的头显。 大众希望苹果回答的问题是“我为什么需要一台AR或者VR产品?”,但苹果回答的是“…...
docker run 命令转化为 docker-compose 工具
工作当中需要将 docker run 转换为更方便的 docker-compose 格式,可以使用下面的工具来完成。 转换工具:https://www.composerize.com/?utm_sourceappinn.com 使用介绍:https://www.appinn.com/composerize-for-docker-compose/...
php如何对接伪原创api
在了解伪原创api的各种应用形态之后,我们继续探讨智能写作背后的核心技术。需要说明的是,智能写作和自然语言生成、自然语言理解、知识图谱、多模算法等各类人工智能算法都有紧密的关联,在百度的智能写作实践中,常根据实际需求将多…...
设计模式行为型——模板模式
目录 模板模式的定义 模板模式的实现 模板模式角色 模板模式类图 模板模式举例 模板模式代码实现 模板模式的特点 优点 缺点 使用场景 注意事项 实际应用 模板模式的定义 模板模式(Template Pattern)属于行为型设计模式,又叫模版…...
12.Eclipse导入Javaweb项目
同事复制一份他的项目给我ekp.rar (懒得从SVN上拉取代码了)放在workspace1目录下 新建一个文件夹 workspace2,Eclipse切换到workspace2工作空间 选择Import导入 选择导入的项目(这里是放到workspace1里面) 拷贝一份到workspace2里面 例子 所有不是在自己电脑上开发…...
探索自动化网页交互的魔力:学习 Selenium 之旅【超详细】
"在当今数字化的世界中,网页自动化已经成为了不可或缺的技能。想象一下,您可以通过编写代码,让浏览器自动执行各种操作,从点击按钮到填写表单,从网页抓取数据到进行自动化测试。学习 Selenium,这一功能…...
css常用样式和不常用样式
文章目录 1、hover鼠标变小手2、ul去除点3、文字溢出显示省略号(1)一行文字溢出显示省略号(2)多行文字溢出显示省略号 4、文字单词超出(1)文字单词超出换行(word-wrap)(2…...
【小练习】交互式网格自定义增删改错误记录及解决(进行中)
经过之前的学习,已经能创建简单的交互式网格并设置自定义增删改按钮,但是实现上还是存在一些问题,来完善优化一下。 首先是修改,正常修改都会弹出修改框,里面是之前存储的信息,根据实际需要对其进行修改&a…...
云渲染效果不对?云渲染前的四个细节表明你的问题出在这里!
云渲染针对3D渲染行业,帮助本地电脑解决渲染慢的问题,大幅提高设计师的工作效率。但小编发现,有不少小伙伴在使用云渲染时,出现了渲染效果不对或丢失的问题,根据小伙伴们的问题和我们创意云云渲染平台给出的解决方案&a…...
翻转二叉树
声明 该系列文章仅仅展示个人的解题思路和分析过程,并非一定是优质题解,重要的是通过分析和解决问题能让我们逐渐熟练和成长,从新手到大佬离不开一个磨练的过程,加油! 原题链接 翻转二叉树备战技术面试?…...
检测新突破 | AlignDet:支持各类检测器自监督新框架(ICCV2023)
引言 论文链接:https://arxiv.org/abs/2307.11077 项目地址:https://github.com/liming-ai/AlignDet 这篇论文主要研究目标检测领域的自监督预训练方法。作者首先指出,当前主流的预训练-微调框架在预训练和微调阶段存在数据、模型和任务上的…...
03.Show and Tell
目录 前言泛读摘要IntroductionRelated Work小结 精读模型基于LSTM的句子生成器TrainingInference 实验评价标准数据集训练细节分数结果生成结果多样性讨论排名结果人工评价结果表征分析 结论 代码 前言 本课程来自深度之眼《多模态》训练营,部分截图来自课程视频。…...
QStackedWidget 的使用
QStackedWidget QStackedWidget 提供一些层叠的 Widget,同一时间只有一个Widget处于可视状态,就像书本一样。 什么时候使用 QStackedWidget 强烈建议 如果需要点击一个按钮显示一些界面再点击按钮隐藏当前界面而去显示另外的界面时。都使用 QStackedW…...
macOS资源下载完全指南:从入门到精通的网络资源嗅探解决方案
macOS资源下载完全指南:从入门到精通的网络资源嗅探解决方案 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 网络…...
FreeRTOS 事件组(Event Group)实战:从基础到高级应用
1. FreeRTOS事件组基础入门 第一次接触FreeRTOS事件组时,我完全被它的简洁高效震惊了。想象一下你正在组织一场多人接力赛,每个选手就像是一个独立的任务,而事件组就是那个能精确协调所有人动作的裁判哨。不同于信号量或队列这些传统同步方式…...
DeepChat案例分享:供应链异常描述→根因推测→应急方案建议三级输出
DeepChat案例分享:供应链异常描述→根因推测→应急方案建议三级输出 1. 案例背景与场景价值 供应链管理是企业运营的核心环节,但异常情况时有发生。传统的异常处理流程往往需要多个部门协作,耗时耗力且容易出错。DeepChat基于本地部署的Lla…...
OpenClaw长期运行:Qwen3.5-9B-AWQ-4bit任务守护与自动恢复
OpenClaw长期运行:Qwen3.5-9B-AWQ-4bit任务守护与自动恢复 1. 为什么需要长期运行守护? 去年冬天,我部署了一个OpenClaw自动化流程来整理每日的技术文献。最初只是简单地在终端启动openclaw gateway,结果第三天就发现进程因为SS…...
AUTOSAR SoAd配置避坑指南:TCP/UDP模式、自动启动与Fanout发送的那些‘坑’
AUTOSAR SoAd实战避坑手册:从TCP连接异常到Fanout发送失效的深度解析 车载以太网通信作为智能汽车的中枢神经系统,其稳定性直接关系到整车功能的可靠性。在AUTOSAR架构中,SoAd模块作为TCP/IP协议栈与上层应用之间的桥梁,其配置复杂…...
什么是电商CRM系统?从入门到精通,全面解析其定义与功能模块
在电商行业竞争日益激烈的今天,如何高效管理客户关系、提升用户价值已成为品牌增长的关键。本文将带您全面了解电商CRM系统,从基础概念到功能模块,再到行业解决方案,助您掌握这一提升业绩的利器。一、电商CRM:数字化时…...
CH343芯片驱动安装全攻略:从Windows到Linux再到MacOS,一篇搞定所有系统
CH343芯片跨平台驱动安装实战指南:从Windows到Linux再到MacOS的完整解决方案 第一次拿到基于CH343芯片的开发板时,我对着电脑上"无法识别的USB设备"提示发呆了十分钟。作为一款支持6Mbps高速传输的USB转串口芯片,CH343在嵌入式开发…...
告别串口调试!用ESP32-C3内置USB-JTAG在VSCode中实现高效开发
告别串口调试!用ESP32-C3内置USB-JTAG在VSCode中实现高效开发 嵌入式开发中,调试环节往往占据大量时间成本。传统串口调试需要反复插拔线缆、配置波特率,而逻辑分析仪又存在价格门槛。ESP32-C3芯片内置的USB-JTAG功能,正在改变这…...
【PyCon 2025闭门分享精要】:Python 3.14 JIT底层调度器深度调优——用3行代码撬动47% CPU利用率提升
第一章:Python 3.14 JIT编译器性能调优配置总览Python 3.14 引入了实验性内置 JIT(Just-In-Time)编译器,基于 Pyston 的优化后端重构,支持函数级动态编译与类型特化。该 JIT 默认处于禁用状态,需通过环境变…...
STM32单片机低功耗模式与应用实践
1. STM32单片机低功耗模式深度解析作为一名嵌入式开发者,我经常遇到需要优化功耗的场景。STM32系列单片机提供了多种低功耗模式,合理使用这些模式可以显著延长电池供电设备的续航时间。本文将结合我多年的实战经验,详细剖析STM32F10xx系列的低…...
