rust abc(5): 常量

在这里插入图片描述

文章目录

    • 1. 目的
    • 2. 基本用法
      • 2.1 说明
      • 2.2 运行结果
    • 3. 不推荐或不正确用法
      • 3.1 不推荐用小写字母作为常量名字
      • 3.2 常量名称中含有小写字母就会报warning
      • 3.3 定义常量时,不指定数据类型会编译报错
    • 4. const 和 immutable 的区别
      • 4.1 const 可以在函数外声明,let 只能在函数内声明
      • 4.2 let 等号右侧可以是运行时确定的内容,const 等号右侧必须编译时确定
    • 5. 总结

1. 目的

学习 rust 语言中常量的使用。

2. 基本用法

2.1 说明

const 大写名字:数据类型 = 值;

例如定义数学中的 π 为常量, const PI:f64 = 3.1415926;

fn main() {// const 大写名字:数据类型 = 值;const PI:f64 = 3.1415926;println!("PI {}", PI);
}

2.2 运行结果

zz@Legion-R7000P% rustc f1.rs 
zz@Legion-R7000P% ./f1 
PI 3.1415926

3. 不推荐或不正确用法

3.1 不推荐用小写字母作为常量名字

fn main() {// 常量 g 是小写字母, rust 编译器会提示为警告const g:f64 = 9.78186;println!("g {}", g);
}

在这里插入图片描述

zz@Legion-R7000P% rustc f2.rs 
warning: constant `g` should have an upper case name--> f2.rs:3:11|
3 |     const g:f64 = 9.78186;|           ^ help: convert the identifier to upper case: `G`|= note: `#[warn(non_upper_case_globals)]` on by defaultwarning: 1 warning emitted

3.2 常量名称中含有小写字母就会报warning

fn main() {// 常量 Gravity 包含了小写字母, rust 编译器会提示为警告const Gravity:f64 = 9.78186;println!("Gravity {}", Gravity);
}

在这里插入图片描述

zz@Legion-R7000P% rustc f3.rs
warning: constant `Gravity` should have an upper case name--> f3.rs:3:11|
3 |     const Gravity:f64 = 9.78186;|           ^^^^^^^ help: convert the identifier to upper case: `GRAVITY`|= note: `#[warn(non_upper_case_globals)]` on by defaultwarning: 1 warning emitted

3.3 定义常量时,不指定数据类型会编译报错

fn main() {// 常量 G 应该指定数据类型,否则编译报错const G = 9.78186;println!("G {}", G);
}

在这里插入图片描述

zz@Legion-R7000P% rustc f4.rs
error: missing type for `const` item--> f4.rs:3:12|
3 |     const G = 9.78186;|            ^ help: provide a type for the constant: `: f64`error: aborting due to previous error

4. const 和 immutable 的区别

抛开变量/常量名字的大小写,我们考虑 const 和 immutable 的区别。如下代码乍一看,好像都表达了 C/C++ 语言中的 const:

let g:f64 = 9.78186;

const G:64 = 9.78186;

4.1 const 可以在函数外声明,let 只能在函数内声明

如下是一个错误示范,会触发编译报错,原因是 let g:f64=9.78186 不能放在函数外头。
f5.rust:

let g:f64 = 9.78186;fn main() {println!("hello rust");
}

在这里插入图片描述

zz@Legion-R7000P% rustc f5.rs 
error: expected item, found keyword `let`--> f5.rs:1:1|
1 | let g:f64 = 9.78186;| ^^^ consider using `const` or `static` instead of `let` for global variableserror: aborting due to previous error

如下是一个正确的例子, const G:f64 = 78186 可以放在函数外定义:
f6.rust:

const G:f64 = 9.78186;fn main() {println!("hello rust");println!("G {}", G);
}

运行不会报错:

zz@Legion-R7000P% ./f6 
hello rust
G 9.78186

4.2 let 等号右侧可以是运行时确定的内容,const 等号右侧必须编译时确定

也就是说, rust 语言中的 const, 表达的是编译期就确定的值, 可以理解为 C/C++ 中的 constexpr, 而并不是等同于 C/C++ 的 const.

例如如下代码的 const H:i32 = a + 232 将导致编译报错, 而 let b = a + 232 则不会报错。
f7.rs:

fn main() {let a = 1;let b = a + 232; // okconst H:i32 = a + 232; // cause compile errorprintln!("a = {}", a);println!("b = {}", b);println!("H = {}", H);
}

在这里插入图片描述

zz@Legion-R7000P% rustc f7.rs 
error[E0435]: attempt to use a non-constant value in a constant--> f7.rs:5:19|
5 |     const H:i32 = a + 232;|     -------       ^ non-constant value|     ||     help: consider using `let` instead of `const`: `let H`error: aborting due to previous errorFor more information about this error, try `rustc --explain E0435`.

5. 总结

  1. rust 语言中的 const 表达的是 C/C++ 中的 constexpr 的含义, 是编译期确定取值,因此不能把运行期确定值的变量赋值到 const 修饰的变量上。

  2. rust 语言的 const, 可以在函数外使用, 而 let a=123 形式定义变量, 虽然是 immutable 的,但是只能在函数内使用。

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

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

相关文章

基于深度学习的高精度安全帽及背心检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度安全帽及背心检测识别系统可用于日常生活中或野外来检测与定位安全帽及背心目标,利用深度学习算法可实现图片、视频、摄像头等方式的安全帽及背心目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系…

WebDAV之π-Disk派盘 + Solid Explorer

Solid Explorer 支持WebDAV方式连接π-Disk派盘。 Solid Explorer 是一款非常优秀的 Android 文件管理器,Material Design 设计风格,双栏布局,可拖拽操作、支持 ROOT 权限、多媒体浏览器、压缩包支持,Chromecast 流支持等众多功…

微信为什么使用 SQLite 保存聊天记录?

概要 SQLite 是一个被大家低估的数据库,但有些人认为它是一个不适合生产环境使用的玩具数据库。事实上,SQLite 是一个非常可靠的数据库,它可以处理 TB 级的数据,但它没有网络层。接下来,本文将与大家共同探讨 SQLite 在…

基于Tensorflow来重现GPT v1模型

OpenAI推出的ChatGPT模型让我们看到了通用人工智能的发展潜力,我也找了GPT的相关论文来进行研究。OpenAI在2017年的论文Improving Language Understanding by Generative Pre-Training提出了GPT的第一个版本,我也基于这个论文来用Tensorflow进行了复现。…

Keepalived 安装与配置

安装 Keepalived apt -y install keepalived 里边有一个杠y,就是我安装的时候里面有yes,就直接是yes 添加 Keepalived 配置 安装好之后, 下一步就开始去来写这个配置文件了,就在这里面去建一个 etc 当中,就是在这个 etc 当中建一个…

认识企业级定时任务Quartz

文章目录 前言一、实现一个Quartz的小案例1.创建一个maven项目2.添加Quartz依赖3.创建一个配置文件配置Quartz信息4.创建一个Job类继承Job接口5.编写主方法逻辑进行测试6.测试运行结果 二、Job和JobDetail总结 前言 目前仍有大部分企业仍在使用Quartz这种定时任务框架&#xf…

45. 跳跃游戏 II (贪心)

题目链接:力扣 解题思路:贪心,尽可能地找到下一跳能够跳到的最远距离,这样到达终点时,所需跳跃次数最少 以nums [2,3,1,1,4,2]为例: 以当前位置begin作为起跳点,能够跳跃的最远距离为m&#…

MySQL每日一练:多表查询——连接查询、子查询

目录 1、首先创建员工表emp和部门表dept: dept表: emp表: 2、插入数据: dept表: emp表: 3、 按条件查找 1、首先创建员工表emp和部门表dept: dept表: create table dept (…

以太网(Ethernet)入门了解

以太网(Ethernet)是一种常见的局域网(LAN)通信协议,它是由Xerox公司于1970年代中期开发的。以太网是一种基于广播技术的开放式网络协议,它允许设备在共享通信介质上进行通信。以下是关于以太网的基本概念、…

MySQL 多表查询练习

1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );创建score表。SQL代码如下: CREATE TABLE s…

OpenCV 入门教程:Laplacian算子和Canny边缘检测

OpenCV 入门教程: Laplacian 算子和 Canny 边缘检测 导语一、Laplacian 算子二、Canny 边缘检测三、示例应用3.1 图像边缘检测3.2 边缘增强 总结 导语 边缘检测在图像处理和计算机视觉领域中起着重要的作用。 Laplacian 算子和 Canny 边缘检测是两种常用的边缘检测…

CAT1模块 EC800M HTTP使用总结记录

分享记录一下 CAT1 模块EC800 HTTP 协议使用流程 ...... by 矜辰所致目录 前言一、基础说明1.1 CAT1 与 4G1.2 EC800M 模块1.3 HTTP 二、开始使用2.1 硬件设计部分2.2 模块上电流程2.3 PDP 上下文2.3.1 什么是 SGSN 和 GGSN ? 三、 HTTP 流程3.1 客户端3.1.1 PDP 上…

Ubuntu18.04 系统安装 Docker

1、首先更新软件源: sudo apt-get updatesudo apt-get upgrade 2、安装Docker: sudo apt install docker -y 3、查看安装的Docker apt list docker 4、查看docker 进程 ps -ef|grep docker 5、查看docker 版本有问题 6、开启Docker服务 systemctl…

10_SPI_Flash 连续写实验

10_SPI_Flash 连续写实验 1. 实验目标2. 连续写方法3. 操作时序4. 流程框图4.1 顶层模块4.2 连续写模块 5. 波形图6. RTL6.1 flash_seq_wr_ctrl6.2 spi_flash_seq_wr 7. Testbench 1. 实验目标 使用页写指令,将串口发送过来的连续不定量数据写入 Flash。本实验中&a…

Web安全——数据库mysql学习

数据库mysql基础 Web安全分享一、数据库的基本操作1、MYSQL登录与退出2、MYSQL数据库的一些解释3、MYSQL注释符有三种: 二、数据库的一些基本操作1、数据库的增删改查(sql语句) 三、table 表的操作1、查看表结构2、查看表的内容3、建立表4、约束条件5、修改表的操作…

网络通信原理系统的认知(NEBASE第十四课)

1 物理层 第一层 物理层:建立、维护、断开物理连接,定义了接口及介质,实现了比特流的传输。 1.1传输层介质分类 有线介质:网线 (双绞线)光纤 无线: 无线电 1.2 双绞线 五类线 cat5 :适用 10…

第二次CCF计算机软件能力认证

第一题:相邻数对 给定 n 个不同的整数,问这些数中有多少对整数,它们的值正好相差 1。 输出格式 输入的第一行包含一个整数 n,表示给定整数的个数。 第二行包含所给定的 n 个整数。 输出格式 输出一个整数,表示值正好相…

KMP算法

KMP KMP 算法是一个快速查找匹配串的算法,它的作用其实就是本题问题:如何快速在「原字符串」中找到「匹配字符串」。 而 KMP 算法的复杂度为 O(mn)实际上是O(N),因为O(M)不可能大于O(N) KMP 之所以能够在 O(mn)复杂度内完成查找,是因为其能…

巴斯夫与长三角物理研究中心开展合作,专注固态和钠离子电池领域

“巴斯夫,全球知名化学公司,宣布与长三角物理研究中心合作,在江苏溧阳市成立联合研究中心,专注于固态电池和钠离子电池的科研。” 根据巴斯夫官方微博消息,新成立的研究中心名为“巴斯夫–长三角物理研究中心新能源汽车…

高德地图的使用

JS API 结合 Vue 使用 高德地图 jsapi 下载、引入 npm add amap/amap-jsapi-loaderimport AMapLoader from amap/amap-jsapi-loader 使用2.0版本的loader需要在window对象下先配置 securityJsCode JS API 安全密钥使用 JS API 使用 script 标签同步加载增加代理服务器设置…