当前位置: 首页 > news >正文

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

研读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!此时程序会直接中断!

相关文章:

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

研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型) 变量|常量与可变性变量声明案例为什么不可变变量可变(mut关键字)变量可变(覆盖) 常量声明 数据类型标量类型整型整型字面值整型溢出问…...

接口的多继承多实现

接口的多继承多实现 目录 接口的多继承多实现多继承(接口1 extends 接口2,接口3)多实现(实现类 实现 接口1,接口2)总结1.类与类的关系2.类和接口的关系3.接口与接口的关系 多继承(接口1 extends 接口2,接口…...

腾讯-iOS面试题-答案

一面 1、介绍一下实习的项目,任务分工,做了哪些工作?介绍实习内容 2、网络相关的:项目里面使用到什么网络库,用过ASIHTTP库吗 在iOS开发中,常用的网络库包括: URLSession:苹果官方提供的网络…...

SQL Server内存架构

2. 内存架构 所谓内存架构,这里是指SQL Server实例内存管理、使用与相关逻辑设计及实现等方面内容。更具体一点,就是讲SQL Server实例分配、管理和使用其内存空间的内部机制。本书1.1节中我们已经讲过,SQL Server实例包括多个内部机制各不相同的内存区域,在此,我们将讲解…...

有哪些功能强大,但是很小众的Python库呢?

Python生态系统中有很多小众但非常强大的库,一般,通俗的规律就是,越是高端,越小众,但是,高端不代表难学,只要理论到了,用起来照样嗖嗖的,以下是一些参考的高端小众库&…...

SpringBoot设计了哪些可拓展的机制?

SpringBoot核心源码 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { ...this.primarySources new LinkedHashSet(Arrays.asList(primarySources));// Servletthis.webApplicationType WebApplicationType.deduceFromClass…...

Layer组件多个iframe弹出层打开与关闭及参数传递

Layer官网地址&#xff1a;http://layer.layui.com/ 1、多个iframe弹出层&#xff08;非嵌套&#xff09; 1.打开iframe弹出层js代码 &#xff08;1&#xff09;示例一&#xff1a; content参数可传入要打开的页面&#xff0c;type参数传2&#xff0c;即可打开iframe类型的弹层…...

BearPi环境搭建及基本使用

这是一篇总结&#xff0c;一些坑的记录 具体教程请访问&#xff1a; BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码 - Gitee.com 第一步&#xff1a;安装虚拟机 不做赘述 第二步&#xff1a;下载资源 这里要用到ubuntu的一些基础知识&#xff0c;不会的…...

算法笔记-换根DP

换根DP 一般是给定一棵不定根树&#xff0c;求以每个节点为根的一些信息。可以通过二次扫描&#xff1a; 第一次扫描&#xff0c;任选一点为根&#xff0c;在有根树上&#xff0c;自底向上转移第二次扫描&#xff0c;从上一次扫描的根开始&#xff0c;自顶向下计算 P3478 [P…...

LeetCode 785. Is Graph Bipartite【DFS,二分图】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

【微信小程序】-- 分包 - 独立分包 分包预下载(四十五)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

2.3 连续性随机变量

思维导图&#xff1a; 学习目标&#xff1a; 我会按照以下步骤学习连续型随机变量&#xff1a; 复习概率论的基础知识&#xff0c;包括概率、期望、方差等概念和公式&#xff0c;以及离散型随机变量的概率分布函数和概率质量函数的概念和性质。 学习连续型随机变量的概念和性…...

【DES详解】(一)处理input block(64 bits)

一、DES 加密算法总览 0-1、初识置换 IP&#xff08;Initial Permutation&#xff09; 输入&#xff1a;明文&#xff08;64 bits&#xff09; 过程&#xff1a;初识置换 输出&#xff1a;处理后的明文permuted input&#xff08;64 bits&#xff09; 首先&#xff0c;对需要解…...

redis笔记——三种特殊的数据结构

三种特殊数据类型 geospatial&#xff08;地理位置&#xff09; 用于定位&#xff0c;附近的人&#xff0c;距离计算 添加元素 geoadd key 经度 纬度 描述名称&#xff0c;可一次添加多个元素 127.0.0.1:6379> geoadd china:city 113.28 23.12 guangzhou (integer) 1 1…...

网络安全之编码加密算法

网络安全之编码加密算法 一、ROT5/13/18/47编码转换二、MD5加密 一、ROT5/13/18/47编码转换 ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码&#xff0c;属于凯撒密码的一种。此类编码具有可逆性&#xff0c;可以自我解密&#xff0c;主要用于应对快速浏览&…...

mp4视频无法播放的解决方法

mp4视频是我们日常工作生活中经常会遇到的视频格式&#xff0c;但如果遇到重要的mp4视频无法播放了&#xff0c;该怎么办呢?有mp4视频无法播放的解决方法吗?下面小编为大家整理了这个问题产生的原因以及相应的解决方法&#xff0c;让我们看一看。 什么情况下会导致mp4视频无法…...

搭建Mysql

登录root账号 su root #上传 mysql-advanced-5.7.17-linux-glibc2.5-x86_64.tar.gz #创建mysql的用户组/用户, data目录及其用户目录 groupadd mysql useradd -g mysql -d /home/mysql mysql mv mysql-advanced-5.7.17-linux-glibc2.5-x86_64 mysql mkdir /home/mysql/data…...

气传导和骨传导耳机哪个好?简单科普这两种蓝牙耳机

在生活中&#xff0c;我们经常会用到耳机&#xff0c;特别是在日常娱乐听歌、运动休闲、户外通勤的时候&#xff0c;一款舒适的耳机是必不可少的。 而最近几年&#xff0c;随着科技的发展&#xff0c;各大品牌也相继推出了各种类型的耳机&#xff0c;其中比较热门的就有气传导…...

浅尝GoWeb开发之Gin框架

一、框架简介 gin 目前应用最广泛的golang框架&#xff0c;甚至已经变成了golang的官方框架&#xff0c;但它主要是一个RESTFul的框架。封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确。个人比较推荐。 beego 国内最早的golang框架&#xff0c;也是最全的MV…...

工程行业管理系统-专业的工程管理软件-提供一站式服务

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…...

Whisper语音识别镜像快速部署:5分钟搭建多语言客服转写服务

Whisper语音识别镜像快速部署&#xff1a;5分钟搭建多语言客服转写服务 1. 引言&#xff1a;语音识别在客服场景的挑战 在全球化的商业环境中&#xff0c;客服中心面临着多语言支持的巨大挑战。传统语音识别系统往往需要为每种语言单独部署模型&#xff0c;不仅成本高昂&…...

5个关键步骤:使用SMUDebugTool解决AMD Ryzen硬件调试难题

5个关键步骤&#xff1a;使用SMUDebugTool解决AMD Ryzen硬件调试难题 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:/…...

深度探索:开源工具OpenCore Legacy Patcher技术揭秘与完整指南

深度探索&#xff1a;开源工具OpenCore Legacy Patcher技术揭秘与完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着苹果系统持续演进&#xff0c;…...

3个创新方法:用Krita AI Diffusion插件实现智能动画制作

3个创新方法&#xff1a;用Krita AI Diffusion插件实现智能动画制作 【免费下载链接】krita-ai-diffusion Streamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gitco…...

GLM-OCR赋能微信小程序:开发随身扫描与文档管理工具

GLM-OCR赋能微信小程序&#xff1a;开发随身扫描与文档管理工具 1. 引言 你有没有遇到过这样的场景&#xff1f;开会时看到白板上写满了重要信息&#xff0c;想快速记录下来&#xff0c;却只能对着手机一张张拍照&#xff0c;事后还得手动整理&#xff1b;或者收到一份纸质合…...

视频硬字幕提取终极指南:用本地AI工具10倍提升你的字幕制作效率

视频硬字幕提取终极指南&#xff1a;用本地AI工具10倍提升你的字幕制作效率 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测…...

Psins实战:从零解析SINS/GPS松组合导航中的Kalman滤波器初始化与调参

1. 初识SINS/GPS松组合导航与Kalman滤波 刚接触导航算法的朋友可能会被"SINS/GPS松组合"这个术语吓到&#xff0c;其实拆开看很简单。SINS&#xff08;捷联惯性导航系统&#xff09;就像是个不知疲倦的计步器&#xff0c;通过IMU&#xff08;惯性测量单元&#xff09…...

别再试图让 Agent 适应你的代码库,而是让代码库和流程适应 Agent。AI Coding Agent 时代,工程师不再是“码农”?Harness Engineering 实战 playbook

AI Coding Agent 时代&#xff0c;工程师不再是“码农”&#xff1f;Harness Engineering 实战 playbook 最近刷到 OpenAI 内部大动作&#xff1a;Greg Brockman 发帖说&#xff0c;他们工程师的工作从去年 12 月开始彻底变了。以前用 Codex 写单元测试&#xff0c;现在 Agent…...

Ubuntu系统通过命令行与GUI配置以太网固定IPv4地址全指南

1. 为什么需要固定IP地址&#xff1f; 在日常使用Ubuntu系统时&#xff0c;大多数情况下我们都会选择自动获取IP地址&#xff08;DHCP&#xff09;。这种方式简单方便&#xff0c;特别适合家庭网络环境。但如果你正在搭建服务器、进行网络调试&#xff0c;或者需要远程访问这台…...

别再乱接纽扣电池了!STM32 VBAT引脚的正确外围电路设计(附5种常见错误分析)

STM32 VBAT电路设计避坑指南&#xff1a;从原理到实践的5个关键错误解析 在STM32硬件设计中&#xff0c;VBAT引脚的处理看似简单&#xff0c;却暗藏玄机。许多工程师在第一次接触这个为RTC和备份寄存器供电的引脚时&#xff0c;往往会陷入"接个电池就能用"的误区。事…...