Rust作者认为变量默认应该是immutable
,即声明后不能被改变的变量。这一点是让跨语言学习者觉得很别扭,不过这一点小的改变带来了诸多好处,本节我们来学习Rust的变量。
什么是变量?
如果你初次学习编程语言,变量会是一个比较抽象的概念。
以Rust语言来说,声明一个变量就是申请一块内存,内存的大小由变量的类型决定,类型我们会在后面的课程介绍。
let a = "abc";
我们使用let
关键字声明一个变量a,同时把abc
存放到变量里面。
此时,我们可以说变量中存储了abc
,也可以说这块内存中存储了abc
。
具体怎么来理解呢?
内存就像这个鸡蛋收纳盒, 我们为每一个蛋格编码(这个编码就相当于内存地址)。声明一个变量a,相当于找到一个空格把它叫做a,同时把鸡蛋放到这个空格里面。我们可以把任何一个空格叫做a,它不过是为蛋格的编码起了一个别名。
下面这个图就描述了我们这段代码实际做的事情,把0xBA0F0140到0xBA0F0152这段内存叫做变量a,并且存储了字符串abc
。
let a = "abc";
a = "efg"; // X 此处报错
我们把在声明变量a时赋值了“abc”,就不能再修改这个变量了。这是Rust的一个语言特性,如果我们后续可能会修改变量a的内容,就需要在声明时添加上mut
关键字,如下:
let mut a = "abc";
a = "efg"; // √
使用let关键字能创建同名变量。
let x = 5;
let x = "abc";
这个特性叫shadowing
,它允许对x再次赋值。不过它并不是修改原来那个x,而是重新开辟了一块内存起了相同的名字。
Rust引入mut关键字的有何优势?
- 不可变变量可以防止意外修改,从而避免数据竞争和内存错误。例如,如果一个变量是不可变的,则无法在多个线程中同时修改它,从而避免数据竞争。
- 不可变变量可以使代码更加简洁易读。例如,如果一个变量是不可变的,则可以明确地表明该变量的值在代码块内不会改变,从而使代码的逻辑更加清晰。
- 不可变变量可以帮助编译器进行优化。例如,如果一个变量是不可变的,则编译器可以知道该变量的值在代码块内不会改变,从而可以进行一些优化,例如消除不必要的计算。
- 不可变变量是函数式编程的重要概念。函数式编程鼓励使用不可变变量和纯函数,从而使代码更加易于理解和测试。
Rust中不可变变量与const有何区别?
const MAX_SIZE: usize = 100;
const
关键字用于定义常量。常量与不可变变量类似,但常量在编译期就确定了值,不能在运行时改变。不可变变量直到运行期来能确定下来。
常量具有以下优点:
- 性能: 常量可以帮助编译器进行优化。
- 可读性: 常量可以使代码更加易读。
如何销毁一个变量?
声明变量对应着申请内存,销毁变量也就是释放对应的内存。
Rust中释放内存有非常复杂的机制,主要分为两类:
- 释放栈内存,离开作用域即使放作用域内的变量。
- 释放堆内存,通常就是由智能指针来释放内存。也是模拟栈内存的释放模式,即在离开作用域时判断是否需要释放内存。
内存的释放是Rust的核心内容,涉及到所有权、借用、和生命周期以及智能指针。这些也是Rust的难点,劝退了众多想尝试Rust的开发者。后面我们会详细介绍这一部分。不过接下来我们需要先铺垫Rust基础内容,以后再探秘这些难点。
总结:
- let关键字用于声明变量,此外它还用于模式匹配。
- mut关键字用于声明可变变量。
- const关键字用于声明常量。
更多关键词可以查看:
https://doc.rust-lang.org/reference/keywords.html
随着课程的展开我们会一一介绍这些关键词,不需要刻意记忆,使用的多了,就会形成肌肉记忆了。