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,欢迎对算法.技术.应用感兴趣的同学加入. 并行编程的需求是显而易见的,其 ...
随机推荐
- 内核不中断前提下,Gaussdb(DWS)内存报错排查方法
摘要:本文主要讲解如何在内核保证操作不能中断采取的特殊处理,理论上用户执行的sql使用的内存(dynamic_used_memory) 是不会大范围的超过max_dynamic_memory的内存的 ...
- 两条命令搞定 ChatGPT API 的调用问题
自2022年11月30日 OpenAI 发布 ChatGPT 以来,虽然时有唱衰的声音出现,但在OpenAI不断推陈出新,陆续发布了OpenAPI.GPT-4.ChatGPT Plugins之后,似乎 ...
- SpringBoot进阶教程(七十五)数据脱敏
无论对于什么业务来说,用户数据信息的安全性无疑都是非常重要的.尤其是在数字经济大火背景下,数据的安全性就显得更加重要.数据脱敏可以分为两个部分,一个是DB层面,防止DB数据泄露,暴露用户信息:一个是接 ...
- Defi开发简介
Defi开发简介 介绍 Defi是去中心化金融的缩写, 是一项旨在利用区块链技术和智能合约创建更加开放,可访问和透明的金融体系的运动. 这与传统金融形成鲜明对比,传统金融通常由少数大型银行和金融机构控 ...
- 使用kubeadm初始化IPV4/IPV6集群
使用kubeadm初始化IPV4/IPV6集群 图片 CentOS 配置YUM源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kube ...
- [数据库]MySQL之备份与恢复【未完待续】
1 恢复 方式一 source sqlFile.sql 登陆MySQL 创建数据库db (create database db;) 进入/使用 数据库db (use db;) 将要导入的sql文件放到 ...
- 五月十六号java基础知识点
1.方法引用就是用双冒号"::"来简化Lambda表达式2.方法引用四种引用方式:1)对象名::实例方法名 //用对象名调用实例方法2)类名::静态方法名 //用类名引用静态方法 ...
- 华为云新一代iPaaS全域融合集成平台全新升级
摘要:基于华为十多年的数字化转型实践,华为云通过组装式交付.数智驱动.DevOps.服务化架构.安全可信.韧性6大关键技术助力客户实现应用现代化和高质量增长,华为云新一代iPaaS全域融合集成平台RO ...
- Prism Sample 24-NavigationJournal
本例是在上一案例中导航参数的基础上增加了导航的历史记录功能,就是向前向后的功能. 导航本身很简单,以下代码就实现了: public void OnNavigatedTo(NavigationConte ...
- 从浏览器输入域名开始分析DNS解析过程
摘要:DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于 TCP/IP 网络. 本文分享自华为云社区<DNS那些事--从浏 ...