Rust通用编程概念(3)

Rust通用编程概念

    • 1.变量和可变性
      • 1.执行`cargo run`
      • 2.变量
      • 3.变量的可变性
      • 4.常量
      • 5.遮蔽
        • 5.1遮蔽与mut区别
          • 1.遮蔽
          • 2.mut
    • 2.数据类型
      • 1.标量类型
        • 1.1整数类型
        • 1.2浮点数类型
        • 1.3数字运算
        • 1.4布尔类型
        • 1.5字符类型
      • 2.复合类型
        • 2.1元组类型
        • 2.2数组类型
          • 1.访问数组
          • 2.无效的数组元素访问
    • 3.函数
      • 3.1定义函数
      • 3.2参数
        • 1.参数使用的注意事项
      • 3.3语句和表达式
      • 3.4带有返回值的函数
    • 4注释
      • 4.1单行注释
      • 4.2多行注释
      • 4.3文档注释
    • 5.控制流
      • 5.1if表达式
      • 5.2使用else if处理多重条件
      • 5.3在let语句中使用if
      • 5.4使用循环重复执行
        • 1.使用loop重复执行代码
          • 1.1从循环返回
        • 2.while条件循环
        • 3.使用for遍历集合

1.变量和可变性

fn main() {let x = 10;println!("The value of x is:{}", x);x = 12;println!("The value of x is:{}", x)
}

1.执行cargo run

  • 下图就是执行之后的报错信息
    在这里插入图片描述

2.变量

  • rust定义的普通变量不能修改
let [变量名] = [变量值]

3.变量的可变性

  • rust虽然普通定义的变量不可修改,可以添加关键字mut,让变量具有可变性
let mut [变量名] = [变量值]
fn main(){let mut x = 10;println!("The value of x is:{}",x);x = 12;println!("The value of x is:{}",x);
}
cargo run
The value of x is: 5
The value of x is: 6

4.常量

  • 常量是绑定一个常量名且不允许更改的值
  • 常量不允许使用mut
  • 常量使用const不是let关键词来声明,并且值的类型必须注明
  • 常量可以在任意作用域内声明
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;

5.遮蔽

fn main(){let x = 8;let x = x + 1;{let x = x * 2;println!("The value of x in the inner scope is:{}",x);// 18}println!("The value of x is: {}",x);// 9
}
  • 首先将数值8绑定到x
  • 通过重复使用let x = 来遮蔽之前的x,并取原来的值+1
  • 作用域内,第三个let语句同样遮蔽前面的x,并且取之前值 * 2
  • 作用域结束,内部遮蔽结束并且x恢复为9

5.1遮蔽与mut区别

1.遮蔽
  • 通过let关键字,再一次有效的创建一个新的变量
let spaces = "  ";// 字符串
let spaces = spaces.len();// 数字类型
2.mut
  • mut关键词主要是对变量的修改
let spaces = "  ";// 字符串
// spaces = spaces.len();// error,数字类型,赋值类型发生变化

2.数据类型

  • Rust的每个值都有确切的数据类型,以下将主要展开两种数据类型:标量类型复合类型
  • Rust是一种静态类型的语言
// cosider giving `guess` a type
// let guess = "90".parse().expect("Not a number!");
let guess: u32 = "90".parse().expect("Not a number!");

1.标量类型

1.1整数类型

长度有符号类型无符号类型
8位i8u8
16位i16u16
32位i32u32
64位i64u64
128位i128u128
archisizeusize
  • 有符号类型的数字范围是-2^(n-1) ~ 2^(n-1)-1
  • 无符号类型的数字范围是0~2^(n)-1
  • isize和usize类型取决于程序运行的计算机体系结构,64位架构系统则位64位,32位结构系统则为32位
  • isize和usize的主要场景是用作某些集合的索引

1.2浮点数类型

  • 浮点数是带有小数点的数字,Rust中的浮点类型也有两种基本类型
  • Rust的浮点型是f32和f64,默认浮点类型是f64
fn main(){
let x = 2.3; // f64
let y: f32 = 3.2; //f32}

1.3数字运算

  • rust的所有数字类型都支持数学运算:加、减、乘、除和取模运算
  • 整数除法会向下取整
 //additionlet sum = 5 + 10;println!("{}", sum);// 15//subtractionlet difference = 96.6 - 94.7;println!("{}", difference);// 1.8999...//multiplicationlet product = 4 * 20;println!("{}", product);// 80//divisionlet quotient = 63.3 / 23.3;let floored = 2 / 3;println!("{}", quotient);// 2.71673...println!("{}", floored);// 0//remainderlet remainder = 43 % 5;println!("{}", remainder);// 3

1.4布尔类型

  • Rust中的布尔类型也有两个可能的值:true和false
  • 布尔值的大小为1个字节
  • Rust中的布尔值使用bool声明
fn main(){let t = true;let f: bool = false
}

1.5字符类型

  • Rust的char(字符)类型是该语言基本的字母类型
  • Rust的字符类型大小为4个字节,表示一个Unicode标量值
fn main(){let c = 'c';let b = 'b';let heart_eyed_cat = '🐱';}

2.复合类型

  • 复合类型可以将多个值组成一个类型,Rust有两种基本的复合类型:元组 和 数组

2.1元组类型

  • 元组是将多种类型的多个值组合到一个复合类型中的基本方式
  • 元组的长度是固定的,声明后,它就无法增产或缩小
fn main(){let tup: (i32,f64,u8) = (500,23.3,5);
}
  • 变量tup绑定到整个元组,因为元素被认作是单个复合元素
  • 可以使用模式匹配来解构元组的一个值
fn main(){let tup = (500,6.2,3);let (x,y,z) = tup;println!("The value of y is:{}",y);// 6.4}
  • 通过模式匹配进行结构外,还可以通过 . 连上访问值得索引来直接访问元组元素
  • 元组中的第一个索引从0开始
fn main(){let x: (i32,f64,u8) = (500,6.3,23);let five_hundred = x.0;let six_point_three = x.1;let twenty_three = x.2;println!("{}",twenty_three);}

2.2数组类型

  • 将多个值组合在一起的另一种方式就是使用数组;与元组不同,数组的每个元素必须具有相同的类型;与其他语言不同数组不同的是,Rust中的数组具有固定长度.
  • 应用场景
    • 确保始终具有固定数量的元素,数组特别有用
    • Vector,在Rust里面,意为"动态数组,可变数组"
    • Vector类型类似于标准库中提供的集合类型
let arr = [12,13,89,56,14];
  • 另一种数组初始化方式
// 变量名为arr的数组包含5个元素,这些元素的初始值都是3
let arr = [3;5]
1.访问数组
  • 数组是可以在栈上分配已知固定大小的单个内存块
  • 可以使用索引访问数组的元素
    let arr = [12, 13, 89, 56, 14];let first = arr[0];let second = arr[1];println!("{}", first); // 12println!("{}", second); // 13
}
2.无效的数组元素访问
  • 访问超出数组末尾的数组元素
use std::io;
fn main() {let arr = [12, 16, 45, 13, 19];println!("please enter an array index.");let mut index = String::new();io::stdin().read_line(&mut index).expect("Failed to read line");let index: usize = index.trim().parse().expect("Index entered was not a number");let element = arr[index];println!("The value of the element at index {} is: {}",index, element);
}
  • 该案例在索引操作使用无效值时导致运行时错误,程序退出并提示错误信息,未执行后面的println!语句
  • rust将检查你指定的索引是否小于或等于数组长度;索引大于或等于数组长度,rust会出现panic

3.函数

  • main函数,它是很多程序的入口点
  • Rust代码中的函数和变量名使用下划线命名法规范风格
  • 在下划线命名法中,所有字母都是小写并使用下划线分隔单词
fn main(){println!("main funcation");another_funcation();
}
fn another_function(){println!("another function")
}

3.1定义函数

  • Rust中函数定义以 fn 开头,后跟着函数名和一对括号;大括号告诉编译器函数体在哪开始和结束

3.2参数

  • 函数可以被定义拥有参数,参数是特殊变量,是函数签名的一分部
  • 当函数拥有参数(形参)时,这些参数提供具体的值(实参)
  • 日常交流中,人们倾向于不区分使用parameterargument来表示函数定义中的变量或调用函数时传入的具体值
fn main(){number_function(10);
}
fn number_function(x: i32){println!("The value of x is:{}",x);//10
}

1.参数使用的注意事项

  • 函数签名中,必须声明每个参数的类型
  • 要求在函数定义中提供类型,意味着编译器几乎从不需要你在代码其他位置注明类型来指出你的意图
  • 一个函数有多个参数时,需要用 逗号隔开
fn main(){print_labeled_measurement(5,'h');
}fn print_labeled_measurement(value: u32,unit_label: char){println!("The measurement is:{}{}",value,unit_label);// 5h
}

3.3语句和表达式

  • 函数体由一系列语句组成,也可以选择表达式结尾
  • 语句是执行一些操作但不返回值的指令
  • 表达式计算并产生一个值
 //语句和表达式let y = 6;println!("{}", y);// 语句不会返回值// let x1 = (let y = 6);let y1 = {let x1 = 5;//行的末尾没有分号,表达式末尾加分号,那么它就转换为语句,而语句不会返回值x1 + 1};println!("The value of y1 is:{}", y1); // 6

3.4带有返回值的函数

  • 函数可以向调用它的代码返回值,但要在箭头(->)后声明它的类型
  • 在Rust中,函数的返回值等同于函数体最后一个表达式的值
  • 使用return关键字和指定值,可以从函数中提前返回;大部分函数隐式返回最后一个表达式
fn five() -> u32{5
}
fn main(){let x = five();println!("The value of x is: {},x);
}
  • 谨慎使用分号

fn five_plus(x: u32) -> u32{//如果在X+1后面加分号,表示语句,没有返回值,将报错// x + 1;x + 1
}
fn main(){let y = five_pluse(5);println!("{}",y); //6
}

4注释

4.1单行注释

  • Rust中,惯用的注释形式以两个斜杠开头,直到该行尾结束
  • 对于超出单行的注释,需要在每行的行首加上 //
fn main(){//I'm feeling lucky todaylet lucky_number = 7;// I’m feeling lucky today
}

4.2多行注释

  • 使用斜杠星号开始和星号斜杠结束,可以跨越多行的注释
/*
这是一个做计算的方法注意传值要求
*/
fn plus_number(x: u32,y: i32) -> u32{x + y
}

4.3文档注释

  • Rust允许你使用特殊的文档注释来为函数、结构体、枚举等代码元素添加文档注释
  • 文档注释以 /// 开始,通常紧跟在你要注释的代码元素之前
/// 这是一个文档注释
fn my_function(){}

5.控制流

  • 根据条件是否为真来决定是否执行某些代码或根据条件是否为真来重复运行一段代码
  • Rust代码中最常见的用来控制执行流的结构是if表达式循环

5.1if表达式

  • if 表达式允许根据条件执行不同的代码分支
fn main(){let number = 3;if number < 5 {println!("condition was true");}else{println!("condition was false");}	
}
  • 需要注意的事代码中的条件必须是bool值

5.2使用else if处理多重条件

  • 可将if 和 else组成的 else if 表达式来实现多重条件
fn main(){let number = 6;if number % 4 == 0 {println!("number is divisible by 4");}else if number % 3 == 0 {println!("number is divisible by 3");}else if number % 2 == 0 {println!("number is divisible by 2");}else{println!("number is not divisible by 4,3,or 2");}}
  • 注意事项
    • 使用过多的else if 表达式回事代码显得杂乱无章,如果超过一个else if 表达式,最好重构代码
    • 使用rust强大的分支结构,match

5.3在let语句中使用if

  • if是一个表达式,可以在let语句的右侧使用它来将结果赋值给一个变量
fn mian(){let condition = true;let number = if condition { 5 } else {6};println!("The value of number is:{}",number);// 5
}

5.4使用循环重复执行

  • Rust有三种循环:loop、while和for

1.使用loop重复执行代码

  • loop关键字告诉rust一遍又一遍执行一段代码知道你明确要求停止
fn main(){//这是一个死循环,通过ctrl+c终止循环loop{println!("again!");}
}
  • 存在嵌套循环,关键词break或continue可以和标签一起使用,有利于业务的实现
fn main(){let mut count = 0;'counting_up': loop{println!("count = {}",count);let mut remaining = 10;loop {println!("reamining = {}",remaining); if remaining == 9 {break;}if count == 2 {break 'counting_up';} remaining -= 1;}count += 1;}println!("End count = {}",count);
}
1.1从循环返回
  • loop的一个用例是重试可能会失败的操作
  • 有时可能会需要将操作的结果从循环中传递给其他的代码
  • 可以用停止循环的 break 表达式添加你想要的返回值
fn main(){let mut counter = 0;let result = loop {counter += 1;if counter == 10 {break counter * 2;}};println!("The value is {}",result); // 20}

2.while条件循环

fn main(){let mut number = 3;while number != 0{println!("{}",number);number -= 1;}println!("LIFTOFF!!!");
}

3.使用for遍历集合

  • while也可以实现遍历集合,但是容易出现下标越界问题,所以一般建议不使用
  • 更加推荐for去实现业务逻辑
fn main() {let arr = [10,20,30,40,50];for element in arr {println!("the value is: {}",element);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/82606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何解决 503 Service Temporarily Unavailable?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

想要精通算法和SQL的成长之路 - 填充书架

想要精通算法和SQL的成长之路 - 填充书架 前言一. 填充书架1.1 优化 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 填充书架 原题链接 题目中有一个值得注意的点就是&#xff1a; 需要按照书本顺序摆放。每一层当中&#xff0c;只要厚度不够了&#xff0c;当前层最高…

【考研数学】高等数学第六模块 —— 空间解析几何(1,向量基本概念与运算)

文章目录 引言一、空间解析几何的理论1.1 基本概念1.2 向量的运算 写在最后 引言 我自认空间想象能力较差&#xff0c;所以当初学这个很吃力。希望现在再接触&#xff0c;能好点。 一、空间解析几何的理论 1.1 基本概念 1.向量 —— 既有大小&#xff0c;又有方向的量称为向…

C语言指针,深度长文全面讲解

指针对于C来说太重要。然而&#xff0c;想要全面理解指针&#xff0c;除了要对C语言有熟练的掌握外&#xff0c;还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。 为什么需要指针&#xff1f; 指针解决了一些编程中基本的问题。…

spring aop源码解析

spring知识回顾 spring的两个重要功能&#xff1a;IOC、AOP&#xff0c;在ioc容器的初始化过程中&#xff0c;会触发2种处理器的调用&#xff0c; 前置处理器(BeanFactoryPostProcessor)后置处理器(BeanPostProcessor)。 前置处理器的调用时机是在容器基本创建完成时&#xff…

Axure原型设计累加器计时器设计效果(职业院校技能大赛物联网技术应用项目原型设计题目)

目录 前言 一、本题实现效果 二、操作步骤 1.新建文件 2.界面设计 2.1文本框 2.2 按钮 2.3设计界面完成 3.交互 3.1启动交互设置 3.2 分别设置三个属性 3.2.1 设置值为“0” 3.2.2 文字于文本框 3.2.3 获取焦点时 3.3 停止按钮的交互动作 3.3.1 设置变量值 3.4 重…

私有化部署企业即时通讯(企业im)除了钉钉还有这些

在现代企业中&#xff0c;私有化部署企业即时通讯平台已经成为确保数据安全和实现高效通信的重要手段。除了众所周知的钉钉&#xff0c;WorkPlus作为领先品牌&#xff0c;提供私有化部署企业即时通讯的领先选择。本文将介绍WorkPlus为企业提供的广阔领域和精彩特点&#xff0c;…

详解FreeRTOS:FreeRTOS任务删除过程源码分析(进阶篇—2)

本篇博文讲解FreeRTOS中任务删除过程的源代码,帮助各位更好理解删除任务的原理和流程。 在详解FreeRTOS:FreeRTOS任务管理函数(基础篇—11)中,讲述了可以使用vTaskDelete()函数实现删除任务。 函数源码如下: 程序说明如下: (1)、调用函数 prvGetTCBFromHandle()获取要删…

MQTT Paho Android 支持SSL/TLS(亲测有效)

MQTT Paho Android 支持SSL/TLS(亲测有效) 登录时支持ssl的交互 这是调测登录界面设计 代码中对ssl/tls的支持 使用MqttAndroidClient配置mqtt客户端请求时&#xff0c;不加密及加密方式连接存在以下几点差异&#xff1a; url及端口差异 val uri: String if (tlsConnect…

链表oj题1(Leetcode)——移除链表元素,反转链表,链表的中间节点,

链表OJ 一&#xff0c;移除链表元素1.1分析1.2代码 二&#xff0c;找到链表的中间节点2.1分析2.2代码 三&#xff0c;反转链表3.1分析3.2代码 四&#xff0c;找到链表中倒数第k个节点4.1分析4.2代码 一&#xff0c;移除链表元素 移除链表元素 1.1分析 这里的删除要分成两种…

9月19日作业

完成文本编辑器的保存工作-代码&#xff1a; void Widget::on_pushButton_4_clicked() {//创建保存文件对话框QString filename QFileDialog::getSaveFileName(this,"保存文件","./","All(*.*);;Text files (*.txt)");//创建一个文件对象&…

【VisualStudio】NuGet包管理器下载缓存packages文件夹过大怎么清理

使用Visual Studio 开发工具时间长了&#xff0c;会发现整个项目的总大小越来越大&#xff0c;默认是存放在电脑系统盘里的&#xff0c;随着Windows11系统常常更新重启&#xff0c;导致系统盘闲置空间越来越小&#xff0c;该怎么办呢。 描述问题 整个解决方案项目会越变越大&…

problen(5)ubuntu版本问题

浅浅记录一下这段时间的血和泪吧&#xff0c;大概耗时快一个月了吧&#xff0c;终于解决了...... 因为需要开启pwn之旅&#xff0c;需要在Ubuntu上安装一些东西&#xff0c;就是下面的一条命令&#xff1a; sudo pip3 install pwntools -i Simple Index&#xff08;显示不太好了…

1、RocketMQ概述

第1章 RocketMQ概述 一、MQ概述 1、MQ简介 MQ&#xff0c;Message Queue&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件&#xff0c;是一套提供了消息生 产、存储、消费全过程API的软件系统。消息即数据。一般消息的体量不会很大。 2、MQ用途 从网上…

Java低代码:jvs-list (子列表)表单回显及触发逻辑引擎配置说明

一、子列表【新增】表单默认回显主列表关联字段 子列表新增表单可使用表单回显配置&#xff0c;在新增表单中默认回显&#xff0c;如图效果 1、子列表中进入新增页面配置 2、切换到表单设置&#xff0c;选择回显设置&#xff0c;进入回显逻辑引擎。 3、在画布中拖入【对象变量…

接入网技术

接入网 接入网是指骨干网络到用户或企业之间的所有设备。其长度一般为几百米到几公里,因而形象地被称为“最后一公里”。接入网地接入方式包括铜线(普通电话线)接入、基于双绞线的ADSL技术、基于HFC网(光纤和同轴电缆(有线电视电缆)混合网)的Cable Modem技术、光纤接入…

【Vue】浏览器自定义格式化工具

当我们不启用浏览器自定义格式化工具&#xff0c;输出 Ref 或者 Reactive 类的值出输出完整的返回值对象&#xff0c;而且 value 值需要再次点击才可以得到。 为了解决这个问题&#xff0c;我们可以开启浏览器自定义格式化工具。 点击 setting 齿轮 依次找到 preference ->…

一对多映射处理

8.3.1 、collection /** * 根据部门id查新部门以及部门中的员工信息 * param did * return */ Dept getDeptEmpByDid(Param("did") int did);<resultMap id"deptEmpMap" type"Dept"> <id property"did" column"did&quo…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署odoo开源ERP平台

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署odoo开源ERP平台 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例使用场景1.3 云耀云服务器L实例特点 二、odoo介绍2.1 odoo简介2.2 odoo特点 三、本次实践介绍3.1 本次实践简介3.2 本…