RUST 学习日记 第5课 ——变量和常量

RUST 学习日记 第5课 ——变量和常量


说些题外话,有些同学认为前面那么点内容,啰啰嗦嗦的讲了四节,其实不然。本系列课程也是适合0基础的同学,如果您是Rust大神,那么可以忽略本系列的文章。还有学习一门编程语言要搞明白是为什么,不能只学习表面。基础一旦打好,学习任何语言都会觉得很容易。俗话说,万事开头难,一旦前面做好铺垫,那么后面再难也难不住你。当然本人水平有限,错误和不足之处在所难免,处理问题也有不妥之处,敬请各位大佬,专家批评改正。

0x00 开篇

上一节咱们了解了Rust的常用规范,算是入乡随俗了。那么从今天开始就要正式进入Rust的学习了。该系列课程预计100课左右,大致将分为基础,进阶,算法,实战四大部分,甚至会更多。课程将会由浅入深的非常细致的讲解Rust,带你深入了解Rust。该系列教程所用的Rust版本是1.52.1(截至目前的最新版本)。

0x01 了解变量

Rust语言的变量是一种绑定语义,相当于是把一个变量名和一个值绑定在一起,从而建立起了关联关系,类似于键值对。为了安全性的考虑,Rust的变量默认是不可以改变的,当然Rust也提供了另一种变量——可变变量。如果你了解过其它语言,你会发现Rust变量的设计与其它语言还是不同的。

0x02 命名规范

Rust变量名可以由字母,数字或者下划线组成。同时还有以下3个限制条件

  • 不能以数字开头
  • 字母区分大小写
  • 不能只有下划线

PS:关于下划线,在Rust中式一种标识符,代表“忽略这个变量”,这里仅了解即可,后续章节会详细介绍。

0x03 不可变变量(Immutable)

在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);
}

0x04 可变变量(Mutable)

使用let关键字声明的变量是不可改变的。如果你试图改变它值,编译器会报错。Cannot assign twice to immutable variable [E0384]

    let x = 5;
// 再次赋值会报错
    x = 15;

这时,如果你想重新对变量赋值,则需要使用mut关键字,告诉编译器这个变量是可以重新赋值的。

// 使用mut关键字声明变量
    let mut y = 5;
// 编译器不会报错
    y = 15;

单从变量赋值这一点,咱们就可以看出Rust的安全性了。增加mut关键字,可以传达该变量允许被更改的意图,使得代码可读性增强,也容易维护。

0x05 变量遮蔽 (Shadowing)

在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常量

CC++Java等常见的语言中是不存在变量遮蔽的,因此变量遮蔽常用于一些特殊场景,将会在后续章节介绍。

0x06 常量(Const)

常量是指绑定到一个标识符且不允许改变的值,其一旦定义后将没有任何方法能够改变它。它还有一个非常重要的特点——常量会在编译时被复制到使用的地方(类似于C语言的#define。 当然,这种复制也会发生在外部包被编译的场合。其声明语法如下:

// 命名规则:变量名全部大写
// 多单词组合使用下划线分割,如:MIN_VALUE
// 必须指定变量的数据类型
// const PI = 3.141592653; [X] 错误写法
const PI : f64 = 3.141592653;

声明规则:

  • 使用const关键字声明
  • 常量的名称通常都是全部采用大写字母,如遇到多单词组合,则使用下划线分割,如:MIN_VALUE
  • 必须指定变量的数据类型(关于数据类型将在下节介绍)

看到这里,心中是否存在疑问——前面说的不可变变量的值不能被更改,常量的值也不能被更改,那么它们有什么区别呢?当然上面也提到了部分区别,下面整理下完整答案。

  • 常量必须使用const关键字声明,且必须注明值的类型,不可变变量使用let关键字声明。
  • 不可变变量可以通过变量遮蔽的方式,让其值改变。实质上是新的变量,只是同名而已。然而常量则没有变量遮蔽的概念,无法重复定义。常量一旦定义,就永远不能变更和重新赋值。
  • 可以在任何作用域中声明常量。在声明它的作用域中,常量在整个生命周期(关于生命周期将在后续章节介绍)中都是有效的。
  • 常量智能被赋值为常量表达式或者数学表达式。不能是函数的返回值,或者是其他在运行时才能确定的值。然而不可变变量则不受限制。

0x07 静态变量——又称全局变量(Static)

静态变量和常量很相似,但是在一个程序中,静态变量拥有精确固定的内存地址,对于静态变量的所有引用都指向相同的内存地址。静态变量也存在生命周期,但是其生命周期在程序中是最长的。静态变量不会在程序结束时调用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);
    }
}

0x08 本节源码

005 · StudyRust - 码云 - 开源中国 (gitee.com)

下节预告——了解下Rust的常见基本数据类型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容