rust abc(4): 定义变量并使用 mut 关键字

news2024/11/24 5:05:03

在这里插入图片描述

文章目录

    • 1. 目的
    • 2. 不可变变量 (immutable variable)
      • 2.1 含义
      • 2.2 代码实例
    • 3. 可变变量 (mutable variable)
      • 3.1 含义
      • 3.2 代码实例
    • 4. 总结

1. 目的

学习 rust 语言中变量的定义方式, 包括普通变量(immutable)、可变变量(mutable)。

本篇博客不涉及引用类型。

2. 不可变变量 (immutable variable)

2.1 含义

rust 语言中定义的变量, 默认是 immutable 类型。啥意思呢?

let a = 1;
let b:i32 = 42;

这样定义的都是 immutable 变量。immutable 指的是取值不能改变。其实可以理解为 C/C++ 中的 const 修饰。 意味着只能在定义时赋值, 定义之外的地方不能修改值,修改就会导致编译报错。

也就是说, 在 rust 语言中, 如下两种定义变量的方式,默认带有 const 属性:

  • let 变量名 = 值; 相当于 C/C++ 的 const auto 变量名 = 值;
  • let 变量名:类型 = 值; 相当于 C/C++ 的 const 类型 变量名 = 值;

2.2 代码实例

d1.rs:

fn main() {
    let a = 1;
    println!("a {}", a);
    a = 2;
    println!("a {}", a);
}

编译运行,的确看到编译报错

zz@Legion-R7000P% rustc d1.rs 
error[E0384]: cannot assign twice to immutable variable `a`
 --> d1.rs:4:5
  |
2 |     let a = 1;
  |         -
  |         |
  |         first assignment to `a`
  |         help: consider making this binding mutable: `mut a`
3 |     println!("a {}", a);
4 |     a = 2;
  |     ^^^^^ cannot assign twice to immutable variable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0384`.

3. 可变变量 (mutable variable)

3.1 含义

所谓可变变量, 就是和前面提到的不可变变量相相反的一种情况: 定义时赋值, 然后定义之外的语句中可以修改值(不过数据类型不能改变)。

具体到代码层面, rust 语言提供了关键字 mut. 有两种用法:

  • let mut 变量名 = 值; 相当于 C/C++ 的 auto var = value;
  • let mut 变量名:类型 = 值; 相当于 C/C++ 的 T var = value;

3.2 代码实例

d2.rs

fn main() {
    let mut a = 1;
    println!("a {}", a);
    a = 2;
    println!("a {}", a);
}

编译运行:

zz@Legion-R7000P% rustc d2.rs
zz@Legion-R7000P% ./d2 
a 1
a 2

4. 总结

Rust 的变量定义, 不考虑引用类型的情况下,其实也不复杂,只有这4种情况。对照 C/C++ 写法, 很容易理解。 只不过需要明确的是, rust 变量默认是 immutable 的,相当于 const 的。受到这种影响的话, 其实写 C/C++ 时,也可以每次都加上 const, 避免不必要的修改,在编译器就可以捕获问题。

rust 语法c/c++ 语法
let 变量名 = 值;const auto 变量名 = 值;
let 变量名:类型 = 值;const 类型 变量名 = 值;
let mut 变量名 = 值;auto var = value;
let mut 变量名:类型 = 值;T var = value;

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

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

相关文章

轻量云服务器(香港)ping不通怎么解决?

​  在使用轻量云服务器(香港)时,有时候会出现ping不通的情况,这时候我们该怎么办呢? 首先,我们需要知道 ping 不通的原因。 ping 是一种基于 ICMP 协议的网络测试工具,它可以用来测试网络连接的质量和速度。如果 ping 不通&am…

英特尔进军晶圆代工,台积电“危”?

近来,半导体市场再次变得繁荣,尤其随着AI大型机模型的出现,半导体巨头们纷纷加大投资力度,以期在AI时代中积蓄新的增长。 作为AI大模型时代中最受益的厂商之一,英伟达稳居市场前沿,而AMD也加入了竞争&…

阿里发布2023年Java社招岗(正式版)面试题

每年的金三银四、金九银十都是各大公司招聘程序员的最佳时期,在这段时间内有好多程序员为面试而发愁,不知道如何才能收到好的 offer,拿到理想的薪资,实现自我的人生价值! 我想告诉大家的是,其实都不用愁的…

Web Worker是什么?怎么用?

71. Web Worker是什么?怎么用? Web Worker 是一种浏览器提供的 JavaScript 特性,它允许在后台线程中运行脚本,从而避免阻塞主线程并提高页面性能和响应速度。 1. Web Worker 的使用方法如下: 创建 Worker 对象&…

chatgpt赋能python:Python编译成库的利与弊

Python编译成库的利与弊 Python作为一种高级编程语言,具有简洁易读的语法和强大的生态系统,在数据科学、Web开发、游戏开发等领域得到广泛应用。然而,Python解释器的执行效率较低,因此为了提高Python程序的性能,常使用…

【嵌入式环境下linux内核及驱动学习笔记-(18)内核驱动模块的启动机制】

目录 1、module_init宏1.1 展开1.2 解释以下几个标识1.2.1 fn1.2.2 id1.2.3 类型 initcall_t :1.2.4 __used1.2.5 __init1.2.6 __attribute__ 1.3 实例说明 2、 驱动启动机制2.1 initcall_t 类型的数组2.2.1 __initcallx_start数组2.2.2 initcall_levels[]数组 2.3 …

每日一练 | 华为认证真题练习Day64

1、如下图所示的网络,所有路由器运行0SPF协议,链路上方为Cost值的大小,则RA路由表中到达网络10.0.0.0/8的Cost值是多少? A. 70 B. 20 C. 60 D. 100 2、如下图所示的网络,主机A没有配置网关,主机B存在网关…

基于GEC6818 Qt智能病房监控系统

文章目录 一、项目设备及平台二、项目功能说明1. 整体功能2. GEC6818开发板功能介绍3. GY39模块功能介绍4. MQ-2型烟雾传感器功能介绍5. RFID模块 三、硬件系统设计实现与图表四、软件系统设计实现与流程图1. 软件系统设计总体描述2. 软件实现流程图3. 操作过程 五、调试过程中…

基于电容电流前馈与电网电压全前馈的单相LCL并网逆变器谐波抑制MATLAB仿真(电压比例反馈及一二次微分反馈)

基于电容电流前馈与电网电压全前馈的单相LCL并网逆变器谐波抑制MATLAB仿真(电压比例反馈及一二次微分反馈)资源-CSDN文库https://download.csdn.net/download/weixin_56691527/87941037模型简介: 参考阮新波教授【LCL型并网逆变器的控制技术…

scrapy的数据保存到数据库

将数据保存到数据库 mysql数据库 下载链接数据库的依赖 Conda/pip install pymysql在piplines.py 文件中 重写open_spider方法 ​ 连接到mysql数据库 def open_spider(self, spider):self.conn pymysql.Connect(hostlocalhost,port3306,userroot,password20020115,dbscrap…

go系列-读取文件

1 概述 2 整个文件读入内存 直接将数据直接读取入内存,是效率最高的一种方式,但此种方式,仅适用于小文件,对于大文件,则不适合,因为比较浪费内存。 2.1 直接指定文化名读取 在 Go 1.16 开始,i…

chatgpt赋能python:Python编程语言制作的著名游戏

Python编程语言制作的著名游戏 Python是一种广泛使用的编程语言,其简单易读的语法让其成为许多游戏开发者的首选。本文将介绍利用Python编程语言制作的几个著名游戏,并将着重标记加粗它们的标题,以便于读者更容易了解。 1. 游戏&#xff1a…

【Python】python入门篇

概述 官网 https://www.python.org/ Python 是一种脚本语言(scripting language)。 与编译型语言(如 C 和 C)不同,Python 的程序代码不需要进行显式的编译,在执行时会动态地解释执行代码。 Python 的脚本执…

FFmpeg 解码 AAC 格式的音频

FFmpeg 默认是可以解码 AAC 格式的音频,但是如果需要获取 PCM16 此类数据则需要经过音频转码。首先要打开解码器,然后向解码器发送 AAC 音频帧(不带 ADTS),然后从解码器获取解码后的音频帧,数据是 float 类…

【软考网络管理员】2023年软考网管初级常见知识考点(12)-应用层协议

涉及知识点 应用层协议详解,DNS的概念,FTP的概念,DHCP的概念,Telnet的概念,电子邮件协议 软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主…

我的内网渗透-代理转发(2)

目录 ssh telnet与SSH的区别 安装环境 常用参数 本地端口转发 远程端口转发 动态端口转发 Socks 使用方法 msf端口转发 常用参数 使用方法 创建监听 MSF读取文件命令(开启msf的时候直接读取文件就自动设置好监听的各种配置) 获取会话后 …

NCI Core Control Messages

NCI 版本参数应编码为 8 位字段,由两个 4 位无符号值组成,表示本规范的主要和次要版本级别。 最高有效 4 位应表示主要版本级别。 最低有效 4 位应表示本规范的次要版本级别。 如果 DH 支持 NFCC 报告的主要版本,则 DH 应继续通信&#xff0…

同比增长超300%,「手势识别」前装赛道借势多模态座舱交互

在座舱多模态交互系统中,手势识别功能正在成为主流的配置之一。高工智能汽车研究院监测数据显示,2022年中国市场(不含进出口)乘用车前装标配手势识别功能交付37.39万辆;今年1-4月交付23.90万辆,同比增长超过…

Linux下的free、uname、uptime、netstat、dmesg指令

文章目录 1 查看内存的使用情况:free2 查看系统与内核相关信息:uname3 查看系统运行时间和负载(uptime)4 查看端口监听:netstat5 分析内核产生的信息:dmesg 1 查看内存的使用情况:free free -m…

C++进阶—二叉搜索树

目录 0. 前言 1. 二叉搜索树概念 2. 二叉搜索树操作 3. 二叉搜索树的实现 3.1 非递归实现插入操作Insert 3.2 二叉搜索树中序遍历递归实现(排序) 3.3 非递归实现查找操作Find 3.4 非递归实现删除操作Erase 3.5 递归实现插入操作InsertR 3.5 递…