rust abc(5): 常量

news2024/12/29 8:38:37

在这里插入图片描述

文章目录

    • 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 default

warning: 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 default

warning: 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 variables

error: 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; // ok

    const H:i32 = a + 232; // cause compile error

    println!("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 error

For 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.coloradmin.cn/o/688602.html

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

相关文章

三、决策树 四、随机森林

三、决策树1.决策树模型的原理1)什么是决策树2)决策树模型原理3.构建决策树的目的4)决策树的优缺点 2.决策树的典型生成算法1)常用的特征选择有信息增益、信息增益率、基尼系数2)基于信息增益的ID3算法3)基…

JAVAWEB 30-

JAVAWEB 30- 快速入门DriverManagerConnectionresultsetPreparedStatement增删改查查询所有添加 修改 MAVEN坐标MyBatis代理开发mybatis查询条件查询添加删除参数传递 快速入门 public static void main(String[] args) throws Exception { /1.注册驱动 Class.forName("co…

【TA100】Bloom算法

一、什么是Bloom算法 1、首先看一下Bloom效果长什么样 2、什么是Bloom ● Bloom,也称辉光,是一种常见的屏幕效果 ● 模拟摄像机的一种图像效果,让画面中较亮的区域“扩散”到周围的区域中,造成一种朦胧的效果 ● 可以让物体具有…

[JVM]再聊 CMS 收集器

题目之所以是再聊,是因为以前聊过: [JVM]聊聊 CMS 收集器 最近又看了下这块的知识,打算把 CMS/标记-清除/GC Roots/引用 这些知识串起来 我依旧可能写的不是很好,降低下期待 GC 算法 CMS 是基于 标记-清除 算法来做的,那我们就先从 GC 算法开始聊 GC 算法有: 标记-清除 标…

一篇博客教会你使用Docker部署Redis哨兵

文章目录 主数据库配置文件启动实例容器虚拟IP 从数据库配置文件启动实例 主从数据库查看主数据库查看从数据库 哨兵配置文件启动哨兵查看哨兵 哨兵机制哨兵选举选举日志重启主数据库 今天我们学习使用 Docker 部署 Redis 的主从复制,并部署 Redis 哨兵,…

Linux学习之grub配置文件介绍

grub配置文件 /etc/default/grub这个文件里边有一些简单的grub配置。 可以看到/etc/default/grub文件里有GRUB_CMDLINE_LINUX"crashkernelauto rhgb quiet idlehalt biosdevname0 net.ifnames0 consoletty0 consolettyS0,115200n8 noibrs nvme_core.io_timeout429496729…

全网独家--【图像色彩增强】方法梳理和问题分析

文章目录 图像增强图像色彩增强问题可视化比较 难点色彩空间大,难以准确表征?不同场景差异大,难以自适应?计算量大,但应用场景往往实时性要求高? 方法传统方法深度学习逐像素预测3D LUT模仿ISP 个人思考批判…

2.数据的类型、数据的输入输出

2.数据的类型、数据的输入输出 2.1 数据类型-常量-变量(整型-浮点-字符)2.1.1 数据类型2.1.2 常量2.1.3 变量2.1.4 整型类型2.1.5 浮点型数据2.1.6 字符型数据字符型常量字符型变量 2.1.7 字符串型常量 2.2 混合运算-printf讲解 2.1 数据类型-常量-变量(整型-浮点-字符) 2.1.1…

shell脚本怎么获取当前脚本名称(获取脚本文件名)$(basename “$0“)(basename命令:去除字符串路径部分、去除后缀)

文章目录 shell脚本如何获取当前执行脚本名称解释:$(basename "$0")$0(当前脚本的名称,带脚本与工作目录之间的相对路径)basename(去除字符串路径部分)示例 拓展:basename命令的完整用…

项目引入多个连接池,导致使用其他连接池,maven分析学习

第一步在命令行中执行 mvn dependency:tree > excludeParentstart.log如果你的settings文件不是项目使用的setting配置,那么就使用下面的命令 mvn -gs 你的路径/apache-maven-3.8.2/conf/settings-person.xml dependency:tree > excludeParentstart.log然后…

Spring学习---上篇

文章目录 1、Spring1.1、简介1.2、优点1.3、Spring的组成1.4、拓展 2、IOC理论推导3、IOC的本质3.1、IOC概念3.2、IoC是Spring框架的核心内容 3、HelloSpring3.1、实现3.2、思考 4、IOC创建对象的方式5、Spring配置5.1、别名(alias)5.2、Bean的配置5.3、…

Multi-class classification without multi-class labels (ICLR 2019)

Multi-class classification without multi-class labels (ICLR 2019) 摘要 这项工作提出了针对多分类的新策略,不需要具体的类别标签,取而代之是利用样本之间的两两相似度,这是一种弱化的标注方式。所提方法称作元分类学习,为两…

ModaHub魔搭社区:向量数据库Milvus使用 MySQL 管理元数据教程

目录 使用 MySQL 管理元数据 常见问题 数据管理相关博客 使用 MySQL 管理元数据 Milvus 默认使用 SQLite 作为元数据后台管理服务,SQLite 内嵌于 Milvus 进程中,无需启动额外服务。但是在生产环境中,基于可靠性的考虑,我们强烈…

【数据库管理】十分钟了解啥是三级封锁协议、X锁和S锁

一.为什么要用锁 在多用户共享系统中,许多事务可能同时对同一数据进行操作,称为“并发操作”,此时数据库管理系统的并发控制子系统负责协调并发事务的执行,保证数据库的完整性不受破坏,同时避免用户得到不正确的数据。…

Spring框架概括

spring是什么? Spring是2003年兴起的,它是一个轻量级的,非侵入式的IOC和AOP的一站式框架,为简化企业级应用开发。 它的特点: 轻量级:指的是核心jar包比较小的。 非侵入式的:框架代码不会侵入…

Java——《面试题——MQ篇》

前文 java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java…

KingFusion3.6是什么?

哈喽,大家好,我是雷工! 今天继续学习KingFusion3.6,以下为学习笔记。 一、KingFusion3.6简介 1、管控一体化全组态平台KingFusion3.6是一款面向工业企业执行层的生产信息化管理系统。 2、KingFusion3.6基于“全组态”技术&#…

使用ROS功能包camera_calibration进行单目相机和双目相机的内参和外参标定

1.概述 本文总结使用ROS标定单目和双目相机的过程,同时提供生成棋盘格文件的方法。 参考链接: [1]使用ros标定相机的内参和外参 [2]ROS下采用camera_calibration进行双目相机标定 2.生成棋盘格文件 棋盘格可以自己买一个,或者打印一个粘在…

日本团队推出 AI 恋爱游戏:主角穿什么,玩家说了算

女主穿什么,还能由玩家决定?! IT之家6月25日消息,来自日本的一个两人团队近期发布了一段视频,展示了一款正在开发中的基于 AI 的恋爱游戏。 在游戏初期,女主角会以黑色剪影的形式出现,针对女主…

紫云谷游记

先说重点,TLNR 1.早点去,方便找地方停车,坐渡船不用排队太久。 2.景区里的饭没外面的好吃。 3.溯溪回来再在游泳池游泳,溯溪凉快,游泳太晒。 4.溯溪真的好爽。 导航: 紫云谷乘船码头停车场 景区介绍就不多说…