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…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...