通用编程概念

变量、基本类型、函数、控制流

变量与可变性

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 通用编程概念的更多相关文章

  1. java第一课 面向对象的编程概念

    一.什么是对象(object)? 对象是相关状态和行为的软件包. 1.现实社会的对象都有两个共同特征:状态和行为.如:狗有状态(名称,颜色,品种,饥饿)和行为(吠叫,取出,摇尾). 2.软件对象在概念 ...

  2. iOS开发应该知道的7个编程概念

    对流行工具(如Xcode)和编程概念(如视图控制器)的高级讨论,这些对iOS开发本身很有用. 1. Xcode Xcode是iOS应用开发社区所见过的最通用的IDE.由于集成开发环境来自Apple,它 ...

  3. [引]MSDN Visual Basic 和 C# 中都会用到的编程概念

    本文转自:http://msdn.microsoft.com/zh-cn/library/dd460655.aspx 本节介绍 Visual Basic 和 C# 中都会用到的编程概念. 本节内容   ...

  4. 深入浅出-iOS函数式编程的实现 && 响应式编程概念

    简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 配图 ...

  5. [HMLY]11.iOS函数式编程的实现&&响应式编程概念

    简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 作为一 ...

  6. Python通用编程

    本文是Python通用编程系列教程,已全部更新完成,实现的目标是从零基础开始到精通Python编程语言.本教程不是对Python的内容进行泛泛而谈,而是精细化,深入化的讲解,共5个阶段,25章内容.所 ...

  7. USB编程概念

     RE:USB编程概念 >请你指导我如何学习USB虚拟COM端口PROGRAMM,什么是我们needto有(如硬件和软件)的东西. USB是一个典型的复杂的协议栈,在协议的协议.这是很难完全实现 ...

  8. SHELL编程概念&变量剖析

    一.shell软件概念和应用场景 1) 学习Linux技术,不是为了学习系统安装.命令操作.用户权限.配置IP.网络管理,学习Linux技术重点:基于Linux系统部署和维护各种应用软件.程序(Apa ...

  9. Tokio,Rust异步编程实践之路

    缘起 在许多编程语言里,我们都非常乐于去研究在这个语言中所使用的异步网络编程的框架,比如说Python的 Gevent.asyncio,Nginx 和 OpenResty,Go 等,今年年初我开始接触 ...

  10. OpenCL学习笔记(二):并行编程概念理解

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 并行编程的需求是显而易见的,其 ...

随机推荐

  1. kafka rebalance你真的了解吗

    介绍 今天主要分享一下 kafka 的 rebalance,在 kafka 中,rebalance 是一个十分重要的概念,很多时候引发的一些问题可能都是由于 rebalance 引起的,rebalan ...

  2. vue环境安装与配置

    https://www.jb51.net/article/251371.htmhttps://www.yht7.com/news/193355 一.下载和安装Vue: https://nodejs.o ...

  3. Onetable:统一的表格式元数据表示

    概括 Onehouse 客户现在可以将他们的 Hudi 表查询为 Apache Iceberg 和/或 Delta Lake 表,享受从云上查询引擎到顶级开源项目的原生性能优化. 在数据平台需求层次结 ...

  4. MATLAB计算变异函数并绘制经验半方差图

      本文介绍基于MATLAB求取空间数据的变异函数,并绘制经验半方差图的方法.   由于本文所用的数据并不是我的,因此遗憾不能将数据一并展示给大家:但是依据本篇博客的思想与对代码的详细解释,大家用自己 ...

  5. 关于关键字final用法以及意义

    *   * 1.final可以用来修饰的结构:类.方法.变量  *   * 2.final用来修饰一个类:此类不能被其他类所继承.  *           比如:String类.System类.St ...

  6. Windows下搭建java环境最新版本jdk运行jar文件

    1:安装JDK(Java Development Kit),链接https://www.oracle.com/java/technologies/downloads/#jdk18-windows下载最 ...

  7. stm32串口烧录程序

    Step1:将BOOT0设置为1,BOOT1设置为0,mcuisp软件不使用STR和DTR烧录 Step2:程序下载完成后,再将BOOT0手动跳帽接GND,复位,这样STM32才可以从Flash中启动 ...

  8. 从0到1手把手教你ASP.NET Core Web API项目配置接口文档Swagger(二)

    传送门:从0到1手把手教你ASP.NET Core Web API项目配置接口文档Swagger(一) 一.设置Swagger页面为首页--开发环境 我们虽然可以在输入 /swagger 后顺利的访问 ...

  9. Redis(一)五种基本数据类型

    1 NoSQl数据库 1.1 技术的发展 技术的分类: ①解决功能性问题:javase ②解决扩展性问题:框架 ③解决性能问题:redis 1.2 NoSQL数据库概述 NoSQL(Not Only ...

  10. S3 对象重命名

    本文所述操作适用于兼容 S3 协议的所有存储框架,包括 AWS S3.Aliyun OSS.MinIO.Ceph 等. 不知为何,截止目前,S3 协议并不包含对象重命名的接口.如果有重命名对象的需求, ...