rust语言精要

rust基本组成
编译器:Rust是一门静态编译型语言。Rust官方的编译器叫rustc,负责将
Rust源代码编译为可执行文件或其他库文件(.a、.so、.lib、.dll等)。特点是跨平台的,后端用了LLVM。
核心库和标准库
Rust语言的语法由核心库和标准库共同提供。其中Rust核心库是标
准库的基础。可以通过在模块顶部引入#![no_std]来使用核心库。核心库和标准库的功能有一些重复。标准库比如有IO操作系统交互。

包管理器:把按一定规则组织的多个rs文件编译后就得到一个包(crate)。包是Rust代码的基本编译单元,也是程序员之间共享代码的基本单元。
Rust提供了非常方便的包管理器Cargo,类似于Python中的pip。
但Cargo不仅局限于包管理,它还为Rust生态系统提供了标准的工作流。Cargo 能够管理整个工作流程,从创建项目、运行单元测试和基准测试,到构建发布链接库,再到运行可执行文件,等等。使用cargo new命令默认可以创建一个用于编写可执行二进制文件的项目。通过给cargo new命令添加–lib参数,则可以创建用于编写库的项目。此外,通过cargo build和cargo run命令可以方便地对项目进行编译和运行。

语句和表达式
Rust 中的语法可以分成两大类:语句(Statement)和表达式
(Expression)
。语句是指要执行的一些操作和产生副作用的表达式。
表达式主要用于计算求值。

语句又分为两种:声明语句( Declaration statement)和表达式语
句( Expression statement)。
· 声明语句,用于声明各种语言项(Item),包括声明变量、静态
变量、常量、结构体、函数等,以及通过extern和use关键字引入包和模
块等。
· 表达式语句,特指以分号结尾的表达式。此类表达式求值结果将
会被舍弃,并总是返回单元类型()。
这部分再说。

变量和绑定
通过let关键字来创建变量,这是Rust语言从函数式语言中借鉴的语
法形式。let创建的变量一般称为绑定(Binding),它表明了标识符
(Identifier)和值(Value)之间建立的一种关联关系。
Rust 中的表达式一般可以分为位置表达式( Place Expression)和
值表达式( Value Expression)。在其他语言中,一般叫作左值
(LValue)和右值(RValue)。
也就是说,左边是代表内存位置的,是变量,右边是要么是字面量,要么是表达式求值过程中创建的临时值。
在这里插入图片描述
这一点优点类似于const关键字,但是也不太一样,const是只读,不允许修改变量,但不是没有写权限。

所有权与引用
当位置表达式出现在值上下文中时,该位置表达式将会把内存地址转移给另外一个位置表达式,这其实是所有权的转移。(注意,字面量不能作为左值。但是变量可以作为右值)
在语义上,每个变量绑定实际上都拥有该存储单元的所有权,这种转移内存地址的行为就是所有权(OwnerShip)的转移,在 Rust 中称为移(Move)语义,那种不转移的情况实际上是一种复制(Copy)语义。Rust没有GC,所以完全依靠所有权来进行内存管理。在日常开发中,有时候并不需要转移所有权。Rust提供引用操作符(&),可以直接获取表达式的存储单元地址,即内存位置。可以通过该内存位置对存储进行读取。
let p=“hello”;
let other=p; 将p的内存地址转移给other;

let a=[1,2,3];
let b=&a; 定义了固定长度数组a,并且使用引用操作符&取得a的内存地址,赋值给 b。这种方式不会引起所有权的转移,因为使用引用操作符已经将赋值表达式右侧变成了位置上下文,它只是共享内存地址。

函数和闭包
函数是通过关键字fn定义的。其函数签名pub fn fizz_buzz(num:i32)->String清晰地反映了函数的类型约定:传入i32类型,返回String类型。

rust是由{}来声明作用域。同一作用域,初始化两次i,i的值为第二次。不同作用域的变量有不同的生命周期,独立的。

函数指针
函数自身就可以作为函数的参数和返回值使用。直接使用函数的名字作为函数指针。
在这里插入图片描述
关于CTEE机制和闭包先不讨论。防止和函数搞混淆。

流程控制
表达式一定会有值,所以if表达式的分支必须返回同一个类型的值
才可以。这也是Rust没有三元操作符?:的原因。if表达式的求值规则
和块表达式一致
在这里插入图片描述
Rust中包括三种循环表达式:while、loop和for…in表达式,其用法
和其他编程语言相应的表达式基本类似。match表达式与模式匹配,有点类似其他编程语言中的switch或case语句。match表达式必须穷尽每一种可能,所以一般情况下,会使用通配符_来处理剩余的情况

基本数据类型
布尔类型
let x=true;
let y:bool=false; 这两种声明是一样的; x as i32把布尔类型转换为整型1。

基本数字类型大致可以分为三类:固定大小的类型、动态大小的类型和浮点数。固定大小的包括无符号有符号。

在Rust中,使用单引号来定义字符(Char)类型。字符类型代表的是一个Unicode标量值,每个字符占4个字节。可以使用as操作符将字符转为数字类型

常用复合数据类型:
元组tuple:可以存储不同类型数据
结构体,枚举体。
常用集合数据类型:
Vec数组,deque双端队列。linkedlist链表,hashmap, btreemap,set等
这些都和C++l类似。

智能指针呢:Box<T>是指向类型为T的堆内存分配值的智能指针。当Box<T>超出作用域范围时,将调用其析构函数,销毁内部对象,并自动释放堆中的内存。可以通过解引用操作符来获取Box<T>中的T。
在这里插入图片描述
泛型和trait是Rust类型系统中最重要的两个概念
Rust 标准库中定义了很多泛型类型,包括 Option<T>、Vec<T>、HashMap<K,V>以及Box<T>等。

在这里插入图片描述
代码第3行到第5行使用trait关键字定义了一个Fly trait。在Rust中,trait是唯一的接口抽象方式。使用trait可以让不同的类型实现同一种行为,也可以为类型添加新的行为
Duck和Pig根据自身的类型针对同一个接口进行Fly,实现了不同的行为。Rust中并没有传统面向对象语言中的继承的概念。Rust通过trait将类型和行为明确地进行了区分,充分贯彻了组合优于继承和面向接口编程的编程思想。
具体不细说
错误处理
Rust 中的错误处理是通过返回 Result<T,E>类型的方式进行的。Result<T,E>类型是Option<T>类型的升级版本。
用于构建健壮的程序,具体也不细说了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus之PromQL语法详解及使用方法

本文是向大家介绍Prometheus中PromQL的查询语法以及常用语句,可以帮助大家理解和掌握Prometheus的查询语言。1、简介Prometheus是通过指标名称(metrics name)以及对应的一组标签(labelset)唯一定义一条时间序列。指标名…

如何选择Facebook的各种广告形式来获取用户?

Facebook广告是吸引潜在客户的重要工具,但盲目投放广告却很难达到理想效果。在选择广告格式时,需要考虑到品牌和业务目标,以及目标受众的特征和偏好。下面介绍8种Facebook广告格式,不论您是想用视频、图片或文字,还是结…

云端Docker搭建ABY库以及本地CLion使用

文章目录ABY的搭建以及使用前言ABY库的下载、安装及测试CLion配置后续杂项项目改名使用其他的库最后ABY的搭建以及使用 前言 仅做记录,仅供参考,不同人有不同的使用方式命令手敲,可能有错,自己辨识勿问,我懂的也不多…

什么牌子的蓝牙耳机音质好又便宜?国产音质好的蓝牙耳机推荐

目前的蓝牙耳机市场涌现了越来越多的蓝牙耳机,不同价位主打不同的性能,有主打佩戴的,主打音质的,主打降噪的,主打游戏的等等。那么,什么牌子的蓝牙耳机音质好又便宜?针对这个问题,我…

Redis详解(redis线程模式、数据持久化机制、主从复制、缓存穿透、缓存击穿等)

一.redis概述redis主要用作数据库、缓存和消息中间件, 支持多种语言, 是基于内存的key-value数据结构存储系统. redis支持数据的持久化, 可以将内存中的数据保存在磁盘中, 重启的时候可以再次加载进行使用.redis不仅仅支持key-value数据结构, 还支持list, set, hash等数据结构.…

CHAPTER 7 HPC集群部署 - hadoop

HPC集群部署 - hadoop1. 介绍2. 优点3. 架构及相关组件3.1 HDFS3.1.1 NameNode3.1.2 DataNode3.1.3 Secondary NameNode3.1.4 Client(客户端)3.2 Mapreduce(分布式计算框架)3.3. HBase(分布式列存储数据库)3.4 Zookeeper&#xff…

【其它】玩一玩无线网桥PicoStation M2

一、无线网桥是什么? 无线网桥就是代替网线实现网络连接的装置。看下面这个场景,摄像头与录像机之间可以直接用网线连接,但遇到两者相距较远的情况,铺设网线成本太高,这时候可以用无线网桥进行连接。无线网桥一般成对…

SSM项目之租赁汽车管理

项⽬描述 汽⻋租赁管理系统,管理系统中不仅有客户的管理还有⻋辆租赁的管理,租赁⻋辆公司对于租⻋的流程,租⻋过程的问题,对于客户的维护及不同维度统计租⻋的情况做数据化管理,⽅便租⻋公司更好的维护⻋辆和⻋辆的信…

易基因: m6A RNA甲基化研究的前期探索性实验思路|干货系列

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近年来,m6A RNA甲基化作为国家自然科学基金表观遗传学研究的热门领域,相关研究成果层出不穷,高分文章不断。研究方向包括疾病发生发展、发育和分化、环…

误删磁盘恢复方法

一、工具如下:1、磁盘分区恢复工具(分区助手 9.8.0)---链接:https://pan.baidu.com/s/1t3siEwtYZl7XtcNJ8t5oLg 提取码:9tsy2、DiskGenius 磁盘信息查看工具(修复要收费):链接:https://pan.baid…

(源码篇02)webpack5中的事件调度系统和NormalModuleFactary核心逻辑

1. 书接上回,从 this.factorizeQueue.add(options, callback); 开始 不是很清楚上下文的兄弟,可以去看下我之前写的 (源码篇01)浅析webpack5中Compiler中重要的hook调用过程。 此文比较干,各位读者开始阅读前&#xf…

反射器和Spring中的IOC/DI

1.什么是反射 1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。 2)Java属于先编译…

LC-1637. 两点之间不包含任何点的最宽垂直区域(模拟)

1637. 两点之间不包含任何点的最宽垂直区域 难度中等25 给你 n 个二维平面上的点 points ,其中 points[i] [xi, yi] ,请你返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 垂直区域 的定义是固定宽度,而 y 轴上无限延伸的一块区域…

户外徒步用什么耳机好?户外运动耳机推荐

作为一个徒步爱好者,在长时间的户外行走的途中自然会准备一个耳机来陪伴我。市面上各种运动型耳机层出不穷,价格也从几十到上千不等。但是喜爱的运动项目不同对运动耳机的需求也不一样。今天我们就来盘带点一下市面上各产品的性能参数,哪一款…

如何理解文件描述符和文件指针,两者的区别和联系?

下面是一些预备的知识: 我们先来回顾一下这张图 如果你对此图并不了解,甚至完全都知道这张图,那么下面的内容了解起来可能并不容易。 第一,首先我们要明确的认识一点,文件流指针是各种语言对系统调用接口的封装&…

代码随想录算法训练营第四十二天 | 416. 分割等和子集

背包问题之01背包问题基础: 视频讲解 (一)常见要求: 有n件物品,每个物品只有一个,和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次&a…

【操作系统】模块六 :文件系统 (Linux文件目录 | 文件系统 | B树 B+树 |分布式文件系统)

文章目录【操作系统】模块六 :文件系统Linux的文件目录分区结构挂载目录结构/usr(Unix System Resource) 包含系统需要的资源文件,通常应用程序会把后来安装的可执行文件 也放到这个目录下,比如说文件系统底层设计 FAT…

树莓派学习笔记(十二)Linux驱动认知及编译加载驱动

文章目录一、Linux驱动认知二、内核空间1、如何找到相关的驱动2、主设备号和次设备号3、驱动链表:管理所有设备的驱动4、驱动插入链表的顺序由设备号检索5、驱动代码的开发三、驱动编写、编译、测试四、驱动阶段性总结一、Linux驱动认知 Linux驱动分为用户空间、内…

TCP网络事件模型的封装2.0

TCP网络事件模型的封装2.0 最近学习了TCP网络模型的封装,其中运用的封装技术个人感觉有点绕 在反复读代码、做思维导图下初步理解了这套封装模型,不禁感叹原来代码还能这样写?神奇! 为此将源码分享出来并将流程图画出&#xff…

FITC-PEG-SH,荧光素-聚乙二醇-巯基的用途:用于修饰氨基酸,蛋白质等

FITC-PEG-SH 荧光素聚乙二醇巯基 英文名称:Fluorescein (polyethylene glycol)Thiol 中文名称:荧光素聚乙二醇巯基 外观: 黄色液体、半固体或固体,取决于分子量。 溶剂:溶于水等其他常规性有机溶剂 激光/发射波长&#xff1a…