[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)的更多相关文章

  1. Java中如何创建不可变(immutable)类

    什么是不可变类 1. 不可变类是指类的实例一经创建完成,这个实例的内容就不会改变. 2. Java中的String和八个基本类型的包装类(Integer, Short, Byte, Long, Dou ...

  2. python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变

    函数参数传递本质上和变量整体复制一样,只是两个变量分别为形参a和实参b.那么,a=b后,a变了,b值是否跟着变呢?这取决于对象内容可变不可变 首先解释一下,什么是python对象的内容可变不可变? p ...

  3. 可变对象(immutable)和不可变对象(mutable)

    可变对象(immutable)和不可变对象(mutable) 这个是之前一直忽略的一个知识点,比方说说起String为什么是一个不可变对象,只知道因为它是被final修饰的所以不可变,而没有抓住不可变 ...

  4. python学习之可变不可变

    在python的数据类型中,整数.字符串.元组是不可变的:而列表.字典是可变的.所以不用C的思维来修改一个整数,它相当于重新定义了一个整数(原来的被覆盖掉了),名字和原来一样,但与前面的同名变量没有一 ...

  5. 【rust】Rust变量绑定(3)

    Rust 是一个静态类型语言,这意味着我们需要先确定我们需要的类型. 什么是变量绑定? 将一些值绑定到一个名字上,这样可以在之后使用他们. 如何声明一个绑定? 使用 let 关键字: fn main( ...

  6. Python(可变/不可变类型,list,tuple,dict,set)

    补充:(可用操作技巧) >>> x=900 >>> y=900 >>> x==y True >>> type(x) is typ ...

  7. [Python] 可变/不可变类型 & 参数传递

    与c/c++不同,Python/Java中的变量都是引用类型,没有值类型 Python赋值语句由三部分构成,例如:   int   a  = 1 类型 标识 值 标识(identity):用于唯一标识 ...

  8. Python--基本数据类型(可变/不可变类型)

    目录 Python--基本数据类型 1.整型 int 2.浮点型 float 3.字符串 str 字符串格式 字符串嵌套 4.列表 list 列表元素的下标位置 索引和切片:字符串,列表常用 5.字典 ...

  9. runtime第二部分成员变量和属性

    接上一篇 http://www.cnblogs.com/ddavidXu/p/5912306.html 转载来源http://www.jianshu.com/p/6b905584f536 http:/ ...

  10. Java可变参数/可变长参数

    Java可变参数/可变长参数 传递的参数不确定长度,是变长的参数,例如小例子: package demo; public class Demo { public static int sum(int ...

随机推荐

  1. [转贴]汉字编码:GB2312, GBK, GB18030, Big5

    汉字编码:GB2312, GBK, GB18030, Big5 https://www.cnblogs.com/malecrab/p/5300497.html 前一篇博文:ANSI是什么编码?中有这样 ...

  2. DashBoard in k8s 简单使用

    DashBoard in k8s 简单使用 第一部分 拉取分发镜像 没办法的事情,公司网络实在是太垃圾了, dockerhub 又不让多次docker pull 找一台网络表好的机器 执行如下命令: ...

  3. uni-app 计算属性 computed

    功能:=>大于1000用kg表示 小于1000,用g表示 计算属性 计算属性必须是有一个返回值的哦 在html写被计算的值 在computed中去直接调用哈 <view> <t ...

  4. NLP涉及技术原理和应用简单讲解【一】:paddle(梯度裁剪、ONNX协议、动态图转静态图、推理部署)

    参考链接: https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/advanced/gradient_clip_cn.html 1. ...

  5. 2.1 CE修改器:精确数值扫描

    本关是CE修改器的第一关,用户需要通过 Cheat Engine 工具完成精确扫描值.在这个练习中,需要将一个特定的数值(健康值)改变为 1000.首先,要确保数值类型设置正确,默认的是2字节或4字节 ...

  6. 8.3 NtGlobalFlag

    NtGlobalFlag 是一个Windows内核全局标记,在Windows调试方案中经常用到.这个标记定义了一组系统的调试参数,包括启用或禁用调试技术的开关.造成崩溃的错误代码和处理方式等等.通过改 ...

  7. 基于.NET三维控件的个性化管道软件开发

    1 简介 管道广泛用于化工.工厂.建筑.市政等方面,关系到国计民生.虽然管道设计软件种类繁多,有的也非常强大(然而也非常昂贵),但也并不能完全满足个性化需要. 如何快速开发一款满足自己需求的三维管道设 ...

  8. Dart常用核心知识

    Dart简述 Dart 是一个为全平台构建快速应用的客户端优化的编程语言,免费且开源. Dart是面向对象的.类定义的.单继承的语言.它的语法涵盖了多种语言的语法特性,如C,JavaScirpt, J ...

  9. 三星发布990 EVO SSD:同时支持PCIe 4.0和PCIe 5.0

    1月8日消息,三星发布了新款产品--990 EVO SSD,这是首款同时支持了PCIe 4.0 x4及PCIe 5.0 x2通道的SSD. 据了解,990 EVO面向中端市场,为2280 M.2规格, ...

  10. Ubuntu ISO镜像文件下载(Ubuntu 22.04.2 LTS)

    Ubuntu 22.04.2 LTS 链接:https://pan.baidu.com/s/1YuWSOBH9mTZMjJTW7HM91g 提取码:b8lf