Rust学习--变量
0x0
每种编程语言都有变量的概念,我们可以把变量理解为最简单的存储方式,它是编码过程中是必不可少的。
Rust的变量很有特色。变量不可变的特性让人想起了Erlang。以及后面的模式匹配,我觉得作者应该受Erlang影响很大。
下面主要介绍一下Rust中变量的几个特性。
- 不可变
- 让变量可变
- 变量与常量的区别
- 隐藏/覆盖
0x1 不可变(immutable)
Rust怎么使用变量呢?
let x = 5;
和其他语言很像,但是变量不能在生命周期内再做如下操作了
x = 6;
这样的话会通不过编译,这就是变量不可变的特性。
为什么要这么做呢?说一下我的理解。
这个特性可以规避掉很多问题,比如一些常见的低级逻辑错误。
更重要的是,这个特性会影响到多线程并发编程。变量不再可变,就不存在临界资源问题,也就不需要引入锁,这会影响到使用者对并发模型的选择和设计。(不评价这种特性的好坏,毕竟这是语言的特性,选择了它就要接受它)。
0x2 让变量可变
如果你熟练使用其他语言的话,会很不适应变量不可变的这种设定。当然了,作者并没有把路堵死,他还留下了一个关键字 -- mut。
let mut x = 5; x = 6;
mut让变量可变成为了可能。
不过,如果没有必要,我是不推荐使用这个关键字的。它为了便捷而破坏了Rust的设计原则,让代码变得不再安全可控。
0x3 变量与常量的区别
到这里,恐怕有些同学已经提出疑问了,const不香吗?
Rust也支持const,这个关键字用来定义常量。真正的不可变。
const和let这两个关键字的区别是什么?
- const不能和mut组合使用
- const必须写明值的类型
- const可以定义在任何作用域
const只能被初始化为常量表达式,不能是函数调用的结构,也不能是运行时才计算出来的结果
const MAX_POINTS: u32 = 100;
说一下我的理解
const应该是个语法糖,它在编译期被解释为和let一样的特性。所以它不能接收运行时计算的结果。
0x4 隐藏/覆盖(Shadowing)
let x = 5; let x = x + 1; let x = x * 2;
使用let关键字,可以覆盖之前同名的变量。以上表达式得到的结果是12
当你迫切的想修改一个变量,这个变量又没有使用关键字mut时,可以用let覆盖上一次的变量。
它的本质是创建一个新变量。所以可以任意修改变量的类型,而mut是不能修改类型的。
let spaces = " "; let spaces = spaces.len();
let mut spaces = " ";
spaces = spaces.len();
前两句代码是可以编译通过的,后两句不行。
0x5 总结
记住三个关键字
- let 定义变量,覆盖变量
- mut 让变量可变
- const 常量