说些题外话,有些同学认为前面那么点内容,啰啰嗦嗦的讲了四节,其实不然。本系列课程也是适合0基础的同学,如果您是Rust大神,那么可以忽略本系列的文章。还有学习一门编程语言要搞明白是为什么,不能只学习表面。基础一旦打好,学习任何语言都会觉得很容易。俗话说,万事开头难,一旦前面做好铺垫,那么后面再难也难不住你。当然本人水平有限,错误和不足之处在所难免,处理问题也有不妥之处,敬请各位大佬,专家批评改正。
上一节咱们了解了Rust的常用规范,算是入乡随俗了。那么从今天开始就要正式进入Rust的学习了。该系列课程预计100课左右,大致将分为基础,进阶,算法,实战四大部分,甚至会更多。课程将会由浅入深的非常细致的讲解Rust,带你深入了解Rust。该系列教程所用的Rust版本是1.52.1
(截至目前的最新版本)。
Rust语言的变量是一种绑定语义,相当于是把一个变量名和一个值绑定在一起,从而建立起了关联关系,类似于键值对。为了安全性的考虑,Rust的变量默认是不可以改变的,当然Rust也提供了另一种变量——可变变量。如果你了解过其它语言,你会发现Rust变量的设计与其它语言还是不同的。
Rust变量名可以由字母,数字或者下划线组成。同时还有以下3个限制条件:
PS:关于下划线,在Rust中式一种标识符,代表“忽略这个变量”,这里仅了解即可,后续章节会详细介绍。
在Rust中是通过let
关键字来声明变量的,变量遵循先声明后使用的原则。确切的说应该是使用let
将值绑定到变量。Rust 通过静态类型确保类型安全。变量绑定可以在声明时说明类型,当然也可以不说明类型,编译器则将会从上下文推导出变量的类型。示例代码如下:
fn main() {
// 每次声明变量时,注意变量命名规范
// 声明整数
let a = 5;
// 布尔值
let b1= true;
// 字符串
let _c = "zhangsan";
// 浮点数
let d_1 = 123.3;
dbg!(a);
dbg!(b1);
dbg!(_c);
dbg!(d_1);
}
使用let
关键字声明的变量是不可改变的。如果你试图改变它值,编译器会报错。Cannot assign twice to immutable variable [E0384]
let x = 5;
// 再次赋值会报错
x = 15;
这时,如果你想重新对变量赋值,则需要使用mut
关键字,告诉编译器这个变量是可以重新赋值的。
// 使用mut关键字声明变量
let mut y = 5;
// 编译器不会报错
y = 15;
单从变量赋值这一点,咱们就可以看出Rust的安全性了。增加mut
关键字,可以传达该变量允许被更改的意图,使得代码可读性增强,也容易维护。
在Rust中,允许在同一代码块中使用let
关键字多次声明同名变量,如果多次声明同一变量,则后者会覆盖前者的值,因此前者的值将无法再去访问,多次覆盖则以最后一次的值为准——这就是变量遮蔽,有时也叫做变量重定义。
// 变量遮蔽
let m = 1;
let m = 2.3;
let m = "张三";
let mut m = 4;
let m = 5;
dbg!(m);
最后输出结果是:
[src\main.rs:37] m = 5
变量遮蔽的实质是同let
声明了一个新的变量,但是巧合的是与之前声明的变量重名了。变量遮蔽有以下几个特点:
static
变量const
常量在C
,C++
,Java
等常见的语言中是不存在变量遮蔽的,因此变量遮蔽常用于一些特殊场景,将会在后续章节介绍。
常量是指绑定到一个标识符且不允许改变的值,其一旦定义后将没有任何方法能够改变它。它还有一个非常重要的特点——常量会在编译时被复制到使用的地方(类似于C语言的#define
)。 当然,这种复制也会发生在外部包被编译的场合。其声明语法如下:
// 命名规则:变量名全部大写
// 多单词组合使用下划线分割,如:MIN_VALUE
// 必须指定变量的数据类型
// const PI = 3.141592653; [X] 错误写法
const PI : f64 = 3.141592653;
声明规则:
const
关键字声明看到这里,心中是否存在疑问——前面说的不可变变量的值不能被更改,常量的值也不能被更改,那么它们有什么区别呢?当然上面也提到了部分区别,下面整理下完整答案。
const
关键字声明,且必须注明值的类型,不可变变量使用let
关键字声明。静态变量和常量很相似,但是在一个程序中,静态变量拥有精确固定的内存地址,对于静态变量的所有引用都指向相同的内存地址。静态变量也存在生命周期,但是其生命周期在程序中是最长的。静态变量不会在程序结束时调用drop
函数。官方文档是这样说的:
A static item is similar to a constant, except that it represents a precise memory location in the program. All references to the static refer to the same memory location. Static items have the lifetime, which outlives all other lifetimes in a Rust program. Static items do not call
drop
at the end of the program.
静态变量是可以用mut
来修饰的,一旦静态变量可变,就会出现多线程同时访问的场景,从而引发内存不安全的问题,因此对于static mut
声明的变量必须在unsafe
块中进行定义(有关unsafe
的内容将在后续章节介绍)。
静态变量和常量的应用场景:
fn main (){
static IP: &str = "111.111.111.111";
static mut NAME : &str = "zhangsan";
dbg!(IP);
unsafe {
dbg!(NAME);
}
}
005 · StudyRust - 码云 - 开源中国 (gitee.com)
下节预告——了解下Rust的常见基本数据类型