Rust 通用编程概念
通用编程概念
变量、基本类型、函数、控制流
变量与可变性
rust中的变量默认是不可变的,这样是为了能够让你安全并且方便地写出复杂、甚至并行的代码。
当一个变量是不可变时,一旦它绑定到了某个值上面,这个值就再也无法被改变了。
1 let x = 5;m,
2 println!("The value of x is : {}", x);
3 x = 6;
4 //^ cannot assign twice to immutable variable
5 println!("The value of x is : {}", x)
编译时的错误提示信息可以帮助我们避免修改一个不可变变量,这种情形非常容易导致一些难以察觉的bug,因为我们的代码逻辑可能会依赖于绑定这个变量上的不可变的值,所以一旦这个值发生变化,程序就无法继续按照期望的方式运行下去,这种bug往往难以追踪,特别是修改操作只在某些条件下偶然发生的时候。在类似的情形下,编译时的错误提示信息就显得相当重要了。
编译器能保证那些声明为不可变的值一定不会发生改变。这意味着你无须在阅读和编写代码时追踪一个变量会如何变化,从而使代码逻辑更加易于理解和推导。
可变变量
通过在声明的变量前添加mut关键字可以使其可变,mut还会向阅读代码的人暗示其他代码可能会改变这个变量的值。
let mut x = 5;
println!("The value of x is {}", x);
x = 6;
println!("The value of x is {}", x);
当你在使用某些重型数据结构时,适当地使用可变性去修改一个实例,可能比赋值和重新返回一个新分配的实例要更有效;而当数据结构较为轻量的时候,采用更偏向函数式的风格,通过创建新变量来进行赋值,可能会使代码更加易于理解。
变量与常量之间的不同
常量,就像不可变变量一样,绑定到常量上的值无法被其他代码修改。
常量和变量之间的区别:
不能用mut关键字来修饰一个常量,常量不仅是默认不可变的,他总是不可变的。
需要使用const关键字而不是let关键字来声明一个常量,在声明的同时,必须标注值的类型
常量可以被声明在任何作用域中,甚至包括全局作用域。用途:可以被不同部分的代码所共享
只能将常量绑定到一个常量表达式上,而无法将一个函数的返回值,或其他需要在运行时计算的值绑定到常量上
const MAX_POINTS: u32 = 100_000;
将整个程序中应编码的值声明为常量并给予其有意义的名字,可以帮助后来的维护者去理解这些值的意义,而使用同一常量来索引相同的应编码值也能为将来的修改提供方便。
常量在整个程序运行的过程中都有自己声明的作用域内有效,这使得常量可以被用于在程序的不同代码之间共享值。
隐藏
一个新声明的变量可以覆盖掉旧的同名变量: 叫做第一个变量被第二变量隐藏了。
let x = 5;
let x = x + 1;
let x = x * 2;
println!("The value of x is {}", x);
因为如果不是在使用let关键字的情况下重新为这个变量赋值,则会导致编译错误。通过使用let,可以对这个值执行一系列的变换操作,并允许这个变量在操作完成后保持自己的不变性。
由于重复使用let关键字会创建出新的变量,所以我们可以在复用变量名称的同时改变它的类型。
隐藏机制不同于将一个变量声明为mut,
let sapce = " ";
let space = space.len();
数据类型
Rust中的每一个值都有其特定的数据类型,rust会根据数据的类型来决定应该如何处理他们:
标量类型
复合类型
rust是一门静态类型语言,这意味着他在编译程序的过程中需要知道所有变量的具体类型。
大部分情况下,编译器都可以根据我们绑定、使用变量的值来自动推导出变量的类型。
let guess : u32 = "42".parse().expect("Not a number");
这里必须显示的标注类型。
标量类型
标量类型是单个值类型的统称。
整数
浮点数
布尔值
字符
整数类型:
| 长度 | 有符号 | 无符号 |
|---|---|---|
| 8bit | i8 | u8 |
| 16bit | i16 | u16 |
| 32bit | i32 | u32 |
| 64bit | i64 | u64 |
| arch | isize |
usize |
Isize 和 size 是两种特殊的整数类型,他们的长度取决于程序运行的目标平台。
注意的:除了byte,其余所有的字面量都可以使用类型后缀。例如: b'a'
rust对于整数字面量的默认推到类型i32通常是一个很好的选择。
较为特殊的两个整型usize和isize则是主要用作某些集合的索引。
整数溢出:在debug模式下发生整数溢出会发出pani!, 而在release模式下,不会包含那些触发panic的代码。
rust会在溢出发生时执行二进制补码环绕,任何超出类型最大值的数据都会被环绕为类型最小值。
浮点数类型
在rust中,默认会将浮点数字面量的类型推到为f64.
let x = 2.0; // f64
let y: f32 = 3.0; //f32
数值运算
let difference = 43.0 - 23.0;
let product = 3 * 3;
let quotient = 56.7 / 32.2;
let remainder = 43 % 3;
布尔类型
let t = true;
let f: bool = false;
字符类型
let x = 'z';
rust中的char类型占四个字节,是一个unicode标量值。
Rust 通用编程概念的更多相关文章
- java第一课 面向对象的编程概念
一.什么是对象(object)? 对象是相关状态和行为的软件包. 1.现实社会的对象都有两个共同特征:状态和行为.如:狗有状态(名称,颜色,品种,饥饿)和行为(吠叫,取出,摇尾). 2.软件对象在概念 ...
- iOS开发应该知道的7个编程概念
对流行工具(如Xcode)和编程概念(如视图控制器)的高级讨论,这些对iOS开发本身很有用. 1. Xcode Xcode是iOS应用开发社区所见过的最通用的IDE.由于集成开发环境来自Apple,它 ...
- [引]MSDN Visual Basic 和 C# 中都会用到的编程概念
本文转自:http://msdn.microsoft.com/zh-cn/library/dd460655.aspx 本节介绍 Visual Basic 和 C# 中都会用到的编程概念. 本节内容 ...
- 深入浅出-iOS函数式编程的实现 && 响应式编程概念
简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 配图 ...
- [HMLY]11.iOS函数式编程的实现&&响应式编程概念
简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 作为一 ...
- Python通用编程
本文是Python通用编程系列教程,已全部更新完成,实现的目标是从零基础开始到精通Python编程语言.本教程不是对Python的内容进行泛泛而谈,而是精细化,深入化的讲解,共5个阶段,25章内容.所 ...
- USB编程概念
RE:USB编程概念 >请你指导我如何学习USB虚拟COM端口PROGRAMM,什么是我们needto有(如硬件和软件)的东西. USB是一个典型的复杂的协议栈,在协议的协议.这是很难完全实现 ...
- SHELL编程概念&变量剖析
一.shell软件概念和应用场景 1) 学习Linux技术,不是为了学习系统安装.命令操作.用户权限.配置IP.网络管理,学习Linux技术重点:基于Linux系统部署和维护各种应用软件.程序(Apa ...
- Tokio,Rust异步编程实践之路
缘起 在许多编程语言里,我们都非常乐于去研究在这个语言中所使用的异步网络编程的框架,比如说Python的 Gevent.asyncio,Nginx 和 OpenResty,Go 等,今年年初我开始接触 ...
- OpenCL学习笔记(二):并行编程概念理解
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 并行编程的需求是显而易见的,其 ...
随机推荐
- 【Visual Leak Detector】配置项 ForceIncludeModulesmd
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记.本篇介绍 VLD 配置文件中配置项 ForceIncludeModules 的使用方法. 同系列文章目录可见 <内存泄漏检测工具&g ...
- 免费1年服务器,部署个ChatGPT专属网页版
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 白皮袄个免费1年服务器,部署个ChatGPT专属网页版! api.openai.com por ...
- [Java] 多线程系列之Fork/Join框架[转载]
1 工作原理 1.1 核心思想:分而治之 & 并行执行 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架, 核心思想就是把大任务分割成若干个小任务,最终汇总每个小任务结果后 ...
- [软件测试]Web接口的性能测试
1 接口响应性能影响因素分析 影响Web接口查询响应性能的重要因素: 1.网络/带宽.服务器硬件资源(CPU.内存.磁盘) 2.用户并发数 3.查询的基础数据集的量级.百万级?亿级?百亿级? 4.查询 ...
- 机器学习(六):回归分析——鸢尾花多变量回归、逻辑回归三分类只用numpy,sigmoid、实现RANSAC 线性拟合
[实验1 回归分析] 一. 预备知识 使用梯度下降法求解多变量回归问题 数据集 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例.数据集内包含 3 类共 150 条记录 ...
- jmap执行失败了,怎么获取heapdump?
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 在之前的OOM问题复盘中,我们添加了jmap脚本来自动dump内存现场,方便排查OOM问题. 但当我反复模拟OO ...
- 操作系统实验 & bochs 环境配置
wsl2 - Ubuntu 22.04 + VSCode + bochs + xfce4 + VcXsrv 笔者环境 wsl2 - Ubuntu 22.04 0. 安装WSL2 & VSCod ...
- 如何遍历HashMap集合?
在Java中,HashMap是一种常用的数据结构,它提供了快速的查找.插入和删除操作.当我们需要遍历HashMap中的所有元素时,可以利用三种不同的方法实现. 方法一:使用键值对遍历 HashMap中 ...
- JUC中常见的集合
Map: HashMap ===> ConcurrentHashMap List: ArrayList ===> CopyOnWriteArrayList Set: HashSet === ...
- 保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话
导读 在当今的人工智能时代,大型AI模型已成为获得人工智能应用程序的关键.但是,这些巨大的模型需要庞大的计算资源和存储空间,因此搭建这些模型并对它们进行交互需要强大的计算能力,这通常需要使用云计算服务 ...