研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型)

news2024/11/24 10:33:19

研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型)

  • 变量|常量与可变性
    • 变量声明
      • 案例
      • 为什么不可变
      • 变量可变(mut关键字)
      • 变量可变(覆盖)
    • 常量声明
  • 数据类型
    • 标量类型
      • 整型
        • 整型字面值
        • 整型溢出问题
      • 浮点型
      • 布尔型
      • 字符类型
    • 复合类型
      • 元组
        • 元组解构
        • 元组取值
      • 数组
        • 数组取值
        • 数组越界

变量|常量与可变性

变量声明

通过使用let 关键字进行变量声明,但是我们要知道如此声明的变量是不可变的!即若不进行指定则变量无法被修改,用Java来说就是在基础类型上添加了final关键字

let x = 1;

案例

fn main() {
    let x = 5;
    println!("{}", x);
    x = 6;
    println!("{}", x);
}

在这里插入图片描述
若你强行给x修改值则会出现如下报错信息

为什么不可变

这一设计相信大家学过Java使用jdk8以上的版本之后在IDEA中编写代码你的变量都会自动添加final关键字,这是因为要保证系统的安全。

所以Rust中直接声明的变量无法改变也是因为需要保证系统的安全,要知道如果程序的模块庞大而分散的时候,在一个地方声明的一个变量在另一个遥远的地方被改变了很容易引发难以追踪的错误。

变量可变(mut关键字)

我们可以通过使用mut关键字来声明一个变量是可变的

fn main() {
    let mut x = 5;
    println!("{}", x);
    x = 6;
    println!("{}", x);
}

但即使是这样,我们依然要知道Rust是一门强类型的语言所以我们不能进行如下的写法:

fn main() {
    let mut x = 5;
    println!("{}", x);
    x = "sgans";
    println!("{}", x);
}

变量可变(覆盖)

我们可以通过声明同一个变量名来修改变量,这样的修改是可以做到无视原始类型的,相当于重新进行了声明,官方称之为隐藏,但我更倾向于覆盖

fn main() {
    let x = 5;
    println!("{}", x);
    let x = "8xx";
    println!("{}", x);
}

常量声明

我们通过使用const关键字对一个常量进行声明,对于常量而言常量是不可变的且一定要规定常量的类型,常量一般使用全大写字符使用_进行单词间的分割,如下:

const TEST:i32 = 10086;

数据类型

上面我们也说过,Rust是个强(静态)类型语言,所以每一个值都有一个属于它的数据类型与之对应

标量类型

标量(scalar)类型代表一个单独的值。Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型

整型

在Rust中有六大类整型,每类分为有符号和无符号
在这里插入图片描述

每一个有符号的变体可以储存包含从-(2^n - 1)2^(n - 1) - 1 在内的数字,这里 n 是变体使用的位数。所以 i8 可以储存从 -(2^7)2^7 - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2n - 1 的数字,所以 u8 可以储存从 0 到 2^8 - 1 的数字,也就是从 0 到 255。

整型字面值

在这里插入图片描述

整型溢出问题

这是个非常经典的问题,因为其他语言中也会有,在Rust中你多数时候不会意识到整型溢出,因为这并不会被检测出来,只有你使用cargo run|check|build命令进行编译时才会检测出来

在Rust中有以下一套规则:
使用 --release flag 在 release 模式中构建时,Rust 不会检测会导致 panic 的整型溢出。相反发生整型溢出时,Rust 会进行一种被称为二进制补码 wrapping(two’s complement wrapping)的操作。简而言之,比此类型能容纳最大值还大的值会回绕到最小值,值 256 变成 0,值 257 变成 1,依此类推。程序不会 panic,不过变量可能也不会是你所期望的值。依赖整型溢出 wrapping 的行为被认为是一种错误。

为了显式地处理溢出的可能性,可以使用这几类标准库提供的原始数字类型方法:

  1. 所有模式下都可以使用 wrapping_* 方法进行 wrapping,如 wrapping_add
  2. 如果 checked_* 方法出现溢出,则返回 None值
  3. overflowing_* 方法返回值和一个布尔值,表示是否出现溢出
  4. saturating_* 方法在值的最小值或最大值处进行饱和处理

浮点型

在Rust中只有以下两种浮点型,且都是有符号的

  1. f32:单精度
  2. f64:双精度

由于f64比f32精度更高,速度几乎一样快,所以我们常使用f64

布尔型

在rust中使用bool作为布尔型(true|false)

let flag:bool = true;

字符类型

let c: char = 'c';
let emoji = '😁';

注意emoji会打印出一个所以还是算了别用吧

复合类型

复合类型(Compound types)可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)

元组

元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小,通过()进行声明且指定每个位置的类型

let tuple: (i8, f64) = (2, 6.332);

元组解构

如下我们通过m,n就能解析并得到对应元组中的值,我们称之为结构赋值

let (m, n) = tuple;

元组取值

元组取值的方式也很简单,你就认为元组是由一个一个单元组成起来的一栋楼,通过门牌号进行方位即可取值

let first = tuple.1

数组

数组中的每个元素的类型必须相同,且长度固定:一旦声明,其长度不会增大或缩小,我们通过[]声明数组

let arr: [i32; 3] = [1, 2, 3];

而这个数组的类型就是[i32; 3]前一个表示公共类型,后一个表示元素个数

数组取值

let first = arr[0];

我们的数组取值是和其他语言一样的

数组越界

这个问题也是一个经典问题了

index out of bounds

若你访问的的索引超出了数组容量,引发数组越界,在Rust中如不对其进行任何处理则会抛出panic!此时程序会直接中断!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ECShop开源商城与COS互通:降低本地存储负载、提升访问体验

ECShop简介 ECShop是一款开源电子商务平台,具有简单易用、安全稳定、模块化设计等特点。它提供了完整的电子商务解决方案,包括商品管理、订单管理、支付管理、配送管理、会员管理、促销管理、数据统计等功能。ECShop支持多语言、多货币、多种支付方式和配…

防火墙做网关双链路接入不同ISP

USG作为校园或大型企业出口网关可以实现内网用户通过两个运营商访问Internet可以实现外网用户访问内网服务器,并保护内网不受网络攻击。 组网需求: 某学校网络通过USG连接到Internet,校内组网情况如下: 校内用户主要分布在教学…

【Java|golang】2409. 统计共同度过的日子数---golang中全局变量带来的坑

Alice 和 Bob 计划分别去罗马开会。 给你四个字符串 arriveAlice ,leaveAlice ,arriveBob 和 leaveBob 。Alice 会在日期 arriveAlice 到 leaveAlice 之间在城市里(日期为闭区间),而 Bob 在日期 arriveBob 到 leaveBo…

CTFWIKI-PWN-ret2libc

目录 1.libc 2.plt 和got 3.调用system 4.flat函数 5.libc泄露 例题1 checksec ida 计算偏移量 查找system.plt 查找/bin/sh 1.ida 2.ROPgadget exp 例题2 checksec ida 思路 给出流程图 查看bss是否可以写入 exp 例题3 checksec ida 偏移量 找puts的go…

投屏市场的挑战与发展趋势

投屏的定义 投屏是指将手机、平板、电脑等设备的屏幕内容无线传输到电视、投影仪等大屏幕上的技术,也称为无线投屏、屏幕镜像、屏幕共享等。投屏技术可以实现多屏互动、内容共享、远程协作等功能,为用户提供更丰富的视听体验和更便捷的工作方式。 投屏市…

Jupyter Notebook小知识

目录 1 快捷键1.1 常用快捷键1.2 魔法函数 2 常用快捷键2.1 模式切换2.2 命令模式快捷键2.3 编辑模式快捷键3 Matplotlib绘图 4 小技巧4.1 文件默认目录的查看以及更改4.2 更改主题颜色 5 其它5.1 python中 r, b, u, f 的含义5.2 f/format():格式化操作 6 常见问题6.1 查看模块…

25K测试老鸟6年经验的面试心得,四种公司、四种问题…

这里总结了下自己今年的面试情况 先说一下自己的个人情况,普通二本计算机专业毕业,懂python,会写脚本,会selenium,会性能。趁着金三银四跳槽季,面试字节跳动测试岗技术面都已经过了,本来以为是…

基于OC端的Bridge-API组件化应用

前言 在移动应用开发中,组件化可以提高代码的模块化和重用性,降低耦合度。当下大部分APP都至少包含一到两种Hybrid框架,H5基本是必要的,还可能叠加React Natvie、Weex或Flutter。 对于Hybird来说,Native的很多能力是…

Ae:自动定向

Ae 菜单:图层/变换/自动定向 Auto-Orient 快捷键:Ctrl Alt O 自动定向 Auto-Orient是 Ae 图层中的一个附加的、隐藏实现(不会在时间轴面板上更改属性的值)的功能,它可以使得图层自动旋转或改变方向以朝向指定的运动路…

HIVE相关操作

HIVE有两种启动方式 方式1: bin/hive 即Hive的Shell客户端,可以直接写SQL方式2: bin/hive --service hiveserver2 后台执行脚本:nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 & bin/hiv…

Vue.js列表渲染指令v-for

目录 一、原理概述 二、基本用法 (1)v-for循环普通数组 (2)v-for循环对象 (3)v-for循环对象数组 (4)v-for迭代整数 一、原理概述 v-for指令时在模板编译的代码生成阶段实现的…

6.java程序员必知必会类库之pdf处理库

前言 Pdf作为我们办公文件中的一种常用文件格式,很多业务中会涉及到一个功能,是将系统中的某些数据,按照要求的格式生成Pdf文件。比如常见的征信报告,合同文件等等,为此通过java代码,处理PDF格式的文件&am…

Vulnhub项目:Earth

靶机地址:The Planets: Earth ~ VulnHub 渗透过程: 首先查看靶机描述,需要获取2个flag 老样子,确定靶机ip,具体的就不详细写了,看图即可 探测靶机开放端口 如果不进行dns绑定,就会出现下面的…

带你玩转状态机(论点:概念、相关图示、示例代码、适用场景、相关文档)

概念 状态机(State Machine)是一种用于描述系统在不同状态下的行为及状态之间转换的数学模型。状态机主要由三个部分组成:状态(State)、事件(Event)和转换(Transition)。…

Vue2-黑马(九)

0目录: (1)router-动态菜单 (2)vuex-入门 (3)vuex-mapState (1)router-动态菜单 我们点击按钮跳转到主页面,主页在制作动态菜单,路由的跳转方…

【PWN】刷题——CTFHub之 简单的 ret2text

萌新第一阶段自然是了解做题的套路、流程,简单题要多做滴 目录 前言 一、checksec查看 二、IDA反汇编 三、exp编写 前言 经典的ret2text流程 一、checksec查看 64位程序,什么保护都没有,No canary found——可以栈溢出控制返回 二、IDA反汇…

SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁

文章目录 1、步骤2、具体过程1、引入pom依赖2、修改配置文件3、单元测试4、测试结果 3、redis运行情况4、项目中实际应用5、加锁解决缓存击穿问题代码一(存在问题)代码二(问题解决) 6、新问题7、分布式锁 1、步骤 前提条件&#…

FFmpeg 编译静态库

1. 使用工具 1.1 FFmpeg 官网: 1.2 FFmpeg macOS 官方安装教程: 1.3 Homebreaw 安装网站: 2. Homebreaw 介绍 2.1 简称 brew,在 Mac 平台终端上管理软件包,安装,更新,卸载等软件 2.2 安装 brew,终端执行指令(内部安装…

HTTP协议详解(一)

目录 1.什么是HTTP协议? 2.HTTP的协议格式 使用fiddler抓包工具 理解代理 查看请求内容 3.HTTP请求(Request) 认识URL URL encode 认识method GET方法 POST方法 经典面试题:POST和GET之间的典型区别 其它方法 认识请求 "报头" (header) Host Conte…

Elasticsearch:为日志分析设置安全的 Elasticsearch 管道

在我之前的许多文章中,我已经详细地描述了如何配置如下的管道: 如果你想了解更多,请详细阅读文章: Logstash:Logstash 入门教程 (二) Elastic:运用 Docker 安装 Elastic Stack 并采…