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.hqwc.cn/news/1195.html

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

相关文章

2022前端趋势报告(上)

前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~ 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 一、前言 本文内容来自于《St…

MySQL 高级(进阶) SQL 语句

目录 创建两个表格 location 表格​编辑 store_info 表格​编辑 ---- SELECT ---- ---- DISTINCT ---- ---- WHERE ---- ---- AND OR ---- ---- IN ---- ---- BETWEEN ---- ---- 通配符 ---- ---- LIKE ---- ---- ORDER BY ---- ---- 函数 ---- ---- GROUP BY ---- ----…

viewLifecycleOwner.lifecycleScope生命周期,kotlin

viewLifecycleOwner.lifecycleScope生命周期,kotlin viewLifecycleOwner.lifecycleScope.launch {viewLifecycleOwner.whenCreated {Log.d(TAG,"onCreated")}viewLifecycleOwner.whenStarted {Log.d(TAG,"onStarted")}viewLifecycleOwner.whenR…

MySQL-SQL全部锁详解(下)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

C++之工厂模式

目录 一、为什么要使用工厂模式 优点 缺点 二、简单工厂(Simple Factory) 好处: 不足: 三、工厂方法: 好处: 不足: 四、抽象工厂(Abstract Factory) 一、为什…

【软考网络管理员】2023年软考网管初级常见知识考点(10)- 网际协议IP及IPV6,IPV4详解

涉及知识点 分类的IP地址,子网划分,CIDR和路由汇聚,IPV4数据报格式,IPV6协议,软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-《拄杖盲学…

数据分析案例-航空公司满意度数据可视化

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

【算法之贪心算法IV】leetcode56. 合并区间

452. 用最少数量的箭引爆气球 力扣题目链接 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴…

IDEA字体配置

IDEA默认字体:JetBrains Mono 1、下载Monaco字体(windows版):下载地址👈 2、双击安装 3、在IDEA中切换Monaco字体

C++ DAY3

1.思维导图 2.有以下类定义&#xff0c;按要求实现剩余功能 #include <iostream> using namespace std;class Person { private:int age;int *p; public://无参构造Person():p(new int(89)){age 18;}//有参构造Person(int age,int num){this->age age;this->pne…

【MySQL】SQL的函数用法

文章目录 聚合函数Count()Max()Min()Sum()Avg() 其他常用函数时间函数字符串函数SUBSTRING函数:切割字符串([start:end])SUBSTRING_INDEX函数:切割字符串(split)LOWER&UPPER函数:大小写转化CONCAT&CONCAT_WS函数:连接字符串REPLACE函数:字符串替换 数学函数ROUND函数:四…

Spring Boot高阶篇笔记

一、Spring Boot整合Redis缓存 JSR-107、Spring缓存抽象、整合Redis 1、JSR107 Java Caching定义了5个核心接口&#xff0c;分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。 • CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应…