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模型)

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

Go和Java实现策略模式

Go和Java实现策略模式 模拟多种营销类型优惠券,折扣⾦额计算策略场景。 1、策略模式 在策略模式中一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式。 在策略模式定义了一系列算法或策略,并将每个算法封装在独立的…

iOS/macOS - 逐行写入文件 (NSFileHandle)

文章目录 - (void)saveDataByLine{NSString *filePath = @"/Users/xx/Library/Containers/com.ds.TMXExport/Data/Library/Caches/a.txt";NSLog(@"filePath : %@", filePath);if (!

代码随想录算法训练营第五十天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

leetcode 123 买卖股票的最佳时机 III 题目链接 123. 买卖股票的最佳时机 III - 力扣(LeetCode) 做题过程 这里有两次交易机会。因此有5种状态。0没有操作,1第一次买入,2第一次卖出,3第二次买入,4第二次…

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&#…

7.7知识点

1.React.createElement() jsx语法是React.createElement()的语法糖 虚拟dom 本质是一个js对象(类型为Object) 虚拟dom属性比较少(轻),真实dom属性方法比较多,因为在react内部使用,没有挂载到真实dom中,所以不用很多真实dom中的属性。(…

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

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

存储优化和Protobuf

存储优化和Protobuf 本文链接:https://blog.csdn.net/feather_wch/article/details/131649688 文章目录 存储优化和ProtobufAndroid存储方式Protobuf介绍使用原理 7z压缩 Android存储方式 1、Android存储方式 SharePreferenceSQLite: 复杂的数据结构File -> p…

以太网(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 上…

Spring MVC JSON 数据交互

🔔 JSON 语法 | 菜鸟教程 为实现浏览器与控制器类之间的 JSON 数据交互, Spring MVC 提供了 MappingJackson2HttpMessageConverter 实现类默认处理 JSON 格式请求响应。该实现类利用 Jackson 开源包读写 JSON 数据,将 Java 对象转换为 JSO…

k8s发生故障,可以从哪些方面排查

目录 第一方面:审视集群状态 第二方面:追踪事件日志 第三方面:聚焦Pod状态 第四方面:检查网络连通性 第五方面:审视存储配置 第六方面:研究容器日志 第一方面:审视集群状态 K8S的集群状态…

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…