rust通用编程概念(代码片段)

davirain davirain     2022-12-07     632

关键词:

通用编程概念

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

变量与可变性

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高并发编程总结(代码片段)

Serverless的概念火了,业界已经不再讨论要不要用Serverless的问题了,而是高喊ServerlessFirst的口号力求快速拥抱Serverless,无服务器并不是Serverless的本质,不需要关心服务器的情况就能高效工作,才是Serverless胜出... 查看详情

rust学习教程23-方法method(代码片段)

本文节选自<<Rust语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433方法Method从面向对象语言过来的同学对于方法肯定不陌生,class里面就充斥着方法的概念,在Rust中方法的概念也大差... 查看详情

rust学习教程23-方法method(代码片段)

本文节选自<<Rust语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433方法Method从面向对象语言过来的同学对于方法肯定不陌生,class里面就充斥着方法的概念,在Rust中方法的概念也大差... 查看详情

rust入坑指南:齐头并进(下)(代码片段)

...中我们聊了Rust如何管理线程以及如何利用Rust中的锁进行编程。今天我们继续学习并发编程,原子类型许多编程语言都会提供原子类型,Rust也不例外,在前文中我们聊了Rust中锁的使用,有了锁,就要小心死锁的问题,Rust虽然声... 查看详情

深入浅出rust异步编程之tokio(代码片段)

深入浅出Rust异步编程之Tokio本文以tokio为例简单介绍Rust异步编程相关的一些知识。首先让我们看看为什么使用rust来进行异步编程。这里tokio官方给出了一个性能测试的对比,可以看到tokio是性能最好,实际上运行这个基准测试的... 查看详情

rust极简教程(代码片段)

...常处理泛型泛型概念特性(接口)文件和IO面向对象并发编程线程消息传递互斥锁代码说明引 查看详情

rust为什么我建议你学一下rust|rust初探(代码片段)

...版本3.HelloWorld三、总结一、Rust的特点Rust是一种多范式、通用编程语言,旨在提高性能和安全性,尤其是安全并发性。Rust在语法上类似于C++,但可以通过使用借用检查器来验证引用来保证内存安全。Rust在没有垃... 查看详情

idea搭建rust开发环境,解决不识别rust工程的解决办法(代码片段)

Rust 是一个由Mozilla主导开发的通用编译型编译语言。它的设计准则为"安全,并发,实用",支持函数式,并发式,过程式以及面向对象的编程风格。Rust插件的主要特性如下:导航特性:GotoClass、GotoSymbol、GotoSuper... 查看详情

rust学习-result/option/unwrap/?(代码片段)

学习Rust时,注意到有4个概念经常放到一起讨论:Result、Option、unwapr和?操作符。本文记录了我对这4个Rust概念的思考,这个思考过程帮助我理解并学会了如何写出更地道的Rust代码。1、Option-可空变量虽然Rust中有null的... 查看详情

rust高并发编程总结(代码片段)

...要总结的模式与套路其实很多,尤其是像Tokio专业的编程框架,对于程序员编写高性能程序的帮助很大。因此本文把之前介绍过的Tokio相关知识点进行一下补充和总结。Future到底是个什么概念简单来讲Future不是一个值,... 查看详情

rust编程语言入门之rust的面向对象编程特性(代码片段)

Rust的面向对象编程特性一、面向对象语言的特性Rust是面向对象编程语言吗?Rust受到多种编程范式的影响,包括面向对象面向对象通常包含以下特性:命名对象、封装、继承对象包含数据和行为“设计模式四人帮”在《设计模型... 查看详情

rust为什么我建议你学一下rust|rust初探(代码片段)

...版本3.HelloWorld三、总结一、Rust的特点Rust是一种多范式、通用编程语言,旨在提高性能和安全性,尤其是安全并发性。Rust在语法上类似于C++,但可以通过使用借用检查器来验证引用来保证内存安全。Rust在没有垃... 查看详情

rust编程语言入门之项目实例:-命令行程序(代码片段)

项目实例:-命令行程序一、实例:接收命令行参数本章内容12.1接收命令行参数12.2读取文件12.3重构:改进模块和错误处理12.4使用TDD(测试驱动开发)开发库功能12.5使用环境变量12.6将错误消息写入标准错误而不是标准输出创建... 查看详情

rust网络编程框架-tokio进阶(代码片段)

我们在上文《小朋友也能听懂的Rust网络编程框架知识-Tokio基础篇》对于Tokio的基础知识进行了一下初步的介绍,本文就对于Tokio的用法及原理进行进一步的介绍与说明。目前市面上绝大多数编程语言所编写的程序,执行程... 查看详情

rust入坑指南:海纳百川(代码片段)

...构、Enum和方法中进行定义。在Rust中,我们习惯使用T作为通用的类型名称,当然也可以是其他名称,只不过习惯上优先使用T(Type)来表示。它可以帮我们消除一些重复代码,例如实现逻辑相同但参数类型不同的两个函数,我们... 查看详情

rust初识及rust的esapi(代码片段)

RustRust是一门系统编程语言,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust在语法上和C++类似,但是设计者想要在保证性能的同时提供更好的内存安全。Rust致力... 查看详情

rust编程语言一(代码片段)

Rust编程语言一usestd::env;fnmain()println!("HelloWorld!\\nI'maRustacean!");println!("days",3);println!("0,thisis1.1,thisis0","Alice","Bob");println!("subjectverbobject",object="thelazydog",subject="thequickbrownfox",ver... 查看详情

rust编程语言二(代码片段)

Rust编程语言二fnmain()letnumber=3;//if条件语句ifnumber%4==0println!("numberisdivisibleby4");elseifnumber%3==0println!("numberisdivisibleby3");elseifnumber%2==0println!("numberisdivisibleby2");elseprintln!("numberisnotdivisibleby4,3,or2... 查看详情