[Rust] 变量的属性: 不可变(immutable), 可变(mutable), 重定义(shadowing), 常量(const), 静态(static)
[Rust] 变量的属性: 不可变(immutable), 可变(mutable), 重定义(shadowing), 常量(const), 静态(static)
变量的可变性
在 Rust 中, 变量可以具有下面的属性。
- immutable: 不可变变量
- mutable: 可变变量
- shadowing: 重定义(遮蔽)一个变量
- const: 常量
- static: 静态变量
不可变变量(immutable) vs 可变变量(mut)
Rust 的安全哲学要求变量默认是不可变的。
fn main() {
// 定义一个不可变的变量
let x = 5;
// 错误: cannot assign twice to immutable variable `x`
// x = 6;
// 定义一个可变的变量
let mut y = 5;
// 正确。可以改变!
y = y + 1;
println!("{}", x + y);
}
重定义(shadowing) vs 可变变量(mut)
重定义(遮蔽)特性是一个 Rust 特有的语言特性。
相对于可变变量,重定义(遮蔽)一个变量,可以改变原有变量的数据类型和可变性。
fn main() {
// 定义一个不可变的变量
let x = 5;
// 重定义变量 x。注意:变量类型和可变性都可以变。
// 变量 x 从整数数据类(i32)型变成了字符串数据类型(String)。
// 变量 x ,因为声明了 mut ,可变性也变成可变的。
let mut x: String = (x + 1).to_string();
// 正确。可以改变!
x = x + ":1";
println!("{}", x);
}
重定义特性的其它特点:
- 重定义特性可以作用于不可变变量
- 重定义特性可以作用于可变变量
- 重定义特性不可以作用于 static 变量
- 重定义特性不可以作用于 const 常量
常量(const)
常量的一个非常重要的特点是: 它的值会在编译时被 copy 到使用的地方。
注意:这种 copy 也会发生在外部包被编译的场合。因此,一定要确保你的常量不会在后续的开发中发生变化。
静态(static)
一个静态变量在应用中拥有唯一的内存地址。
大多数场合,静态变量会被定义为可变的。
在 Rust 的安全哲学中静态变量不是线程安全的,所以可变的静态变量在被读和写的场合,都需要标识 unsafe。
// 定义一个可变的静态变量
static mut LEVEL: i32 = 5;
// 定义一个不可变的静态变量
static CORRECT: i32 = 1;
fn main() {
// 错误: note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
LEVEL = LEVEL + 1;
// 错误: note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
println!("{}", LEVEL);
// 正确: 不可变的静态变量是线程安全的。
println!("{}", CORRECT);
// 读写静态变量都需要在unsafe中
unsafe {
// LEVEL = LEVEL + 1;
println!("{}", LEVEL);
}
}
静态(static) vs 常量(const)
那么,什么时候使用静态变量?什么时候使用常量呢?
- 数据占有内存比较大的场合,使用静态变量;
- 程序需要变量的地址属性的情况下,使用静态变量;
- 变量需要是可变的情况下,使用静态变量;
- 其它场合,推荐使用常量;
参照
[Rust] 变量的属性: 不可变(immutable), 可变(mutable), 重定义(shadowing), 常量(const), 静态(static)的更多相关文章
- Java中如何创建不可变(immutable)类
什么是不可变类 1. 不可变类是指类的实例一经创建完成,这个实例的内容就不会改变. 2. Java中的String和八个基本类型的包装类(Integer, Short, Byte, Long, Dou ...
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
函数参数传递本质上和变量整体复制一样,只是两个变量分别为形参a和实参b.那么,a=b后,a变了,b值是否跟着变呢?这取决于对象内容可变不可变 首先解释一下,什么是python对象的内容可变不可变? p ...
- 可变对象(immutable)和不可变对象(mutable)
可变对象(immutable)和不可变对象(mutable) 这个是之前一直忽略的一个知识点,比方说说起String为什么是一个不可变对象,只知道因为它是被final修饰的所以不可变,而没有抓住不可变 ...
- python学习之可变不可变
在python的数据类型中,整数.字符串.元组是不可变的:而列表.字典是可变的.所以不用C的思维来修改一个整数,它相当于重新定义了一个整数(原来的被覆盖掉了),名字和原来一样,但与前面的同名变量没有一 ...
- 【rust】Rust变量绑定(3)
Rust 是一个静态类型语言,这意味着我们需要先确定我们需要的类型. 什么是变量绑定? 将一些值绑定到一个名字上,这样可以在之后使用他们. 如何声明一个绑定? 使用 let 关键字: fn main( ...
- Python(可变/不可变类型,list,tuple,dict,set)
补充:(可用操作技巧) >>> x=900 >>> y=900 >>> x==y True >>> type(x) is typ ...
- [Python] 可变/不可变类型 & 参数传递
与c/c++不同,Python/Java中的变量都是引用类型,没有值类型 Python赋值语句由三部分构成,例如: int a = 1 类型 标识 值 标识(identity):用于唯一标识 ...
- Python--基本数据类型(可变/不可变类型)
目录 Python--基本数据类型 1.整型 int 2.浮点型 float 3.字符串 str 字符串格式 字符串嵌套 4.列表 list 列表元素的下标位置 索引和切片:字符串,列表常用 5.字典 ...
- runtime第二部分成员变量和属性
接上一篇 http://www.cnblogs.com/ddavidXu/p/5912306.html 转载来源http://www.jianshu.com/p/6b905584f536 http:/ ...
- Java可变参数/可变长参数
Java可变参数/可变长参数 传递的参数不确定长度,是变长的参数,例如小例子: package demo; public class Demo { public static int sum(int ...
随机推荐
- IPMI的简单使用
背景 公司一台十一年前的服务器砸到我手中,要重装CentOS7的操作系统. 本着不想进机房, 不想格式化U盘的想法, 想用BMC进行安装系统. 遇到的第一个问题是不知道密码. 询问之前的机器持有人,也 ...
- vue中v-show你不知道的用法 created computed mounted的执行顺序
我们都知道,v-show的值是一个布尔类型的. 我通过这个值进行显示或者隐藏. 但是有些时候,这个值是true还是false,我们需要去进行计算 此时我们就可以使用v-show="XXX() ...
- 【0基础学爬虫】爬虫基础之自动化工具 Selenium 的使用
大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...
- errgroup的常见误用
errgroup想必稍有经验的golang程序员都应该听说过,实际项目中用过的也应该不在少数.它和sync.WaitGroup类似,都可以发起执行并等待一组协程直到所有协程运行结束.除此之外errgr ...
- C++ LibCurl实现Web隐藏目录扫描
LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP.FTP.SMTP.POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发 ...
- Linux系统的一些实用操作 [补档-2023-07-30]
Linux的实用操作 4-1.常用快捷键 强制停止:当某些程序运行时,或者命令输入错误时,可以通过 ctrl + c 来强制结束当前的操作. 退出或登出:当我们要退出某些用户时,或者要退出某些特殊的页 ...
- 自然语言开发AI应用,利用云雀大模型打造自己的专属AI机器人
如今,大模型层出不穷,这为自然语言处理.计算机视觉.语音识别和其他领域的人工智能任务带来了重大的突破和进展.大模型通常指那些参数量庞大.层数深.拥有巨大的计算能力和数据训练集的模型. 但不能不承认的是 ...
- crontab 里如何创建带日期的日志文件
需求在crontab 执行定时任务时,将执行的任务输出到带日期的文件中 crontab中,执行脚本需要传入系统时间date +"%Y-%m-%d" 问题今天遇到一个crontab问 ...
- 分布式图算法Pregel
最近看了Google的Pregel论文,图算法有一些经典且不可被替代的应用场景,如社交网络,相互引用等.但是在单个结点上的运算量往往过少,注重的是消息传播和逻辑处理,而不是单纯的大规模计算.虽然已经过 ...
- JS Leetcode 213. 打家劫舍 II 题解分析,在动态规划基础上感受分治算法的魅力
壹 ❀ 引 本题来自LeetCode 213. 打家劫舍 II,难度中等,属于前面我们做过的198. 打家劫舍的升级版,难度同样为中等,题目描述如下: 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内 ...