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

Rust学习--变量的更多相关文章

  1. Rust学习-阶段1学习总结

    学习Rust已经两周了,基本上是断断续续的在学,或者是在上下班坐公交时,或者是在ODC没事做时.现在已经学习了Rust程序设计语言的前5章,是时候做一个总结了.关于数据类型或者if else这种内容我 ...

  2. Rust学习笔记一 数据类型

    写在前面 我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差. 自学了Java.Kotlin.Python. ...

  3. 7. 由一道ctf学习变量覆盖漏洞

    0×00 背景 近期在研究学习变量覆盖漏洞的问题,于是就把之前学习的和近期看到的CTF题目中有关变量覆盖的题目结合下进一步研究. 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导 ...

  4. Rust学习资源和路线

    Rust学习资源和路线 来源 https://rust-lang-cn.org/article/23 学习资源 The Rust Programming Language 堪称Rust的"T ...

  5. 【译】通过 Rust 学习解析器组合器 — Part 1

    原文地址:Learning Parser Combinators With Rust 原文作者:Bodil 译文出自:掘金翻译计划 本文永久链接:https://github.com/xitu/gol ...

  6. Rust学习笔记1

    这是一份不错的rust教程,目前包括4个block和4个project.全部完成后可以用rust实现一个简单的key-value存储引擎. 注意:Windows下rust貌似会遇到一些bug,强烈建议 ...

  7. 3-python学习——变量

    变量是我所接触过的编程语言中都具有的一个概念,只是这个概念有的强有的弱罢了. 1.什么是python的变量 变量这个东西怎么解释呢?不怎么好说. 这么说吧,变量就相当于一个代名词,或者说是名字. 计算 ...

  8. js学习--变量作用域和作用域链

    作为一名菜鸟的我,每天学点的感觉还是不错的.今天学习闭包的过程中看到作用域与作用域链这两个概念,我觉得作为一名有追求的小白,有必要详细了解下. 变量的作用域 就js变量而言,有全局变量和局部变量.这里 ...

  9. shell脚本学习-变量

    跟着RUNOOB网站的教程学习的笔记 shell变量 shell变量的命名 定义变量时,变量名不加美元符号($,PHP语言中需要),如: name="runoob" 注意,变量名与 ...

随机推荐

  1. 四、JVM之栈与栈帧

    栈: 1.又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把 另一端称为栈底.其特性是先进后出. 2.栈是线程私有的,生命周期跟线程相同,当创 ...

  2. dp - 递推

    C. Multiplicity time limit per test 3 seconds memory limit per test 256 megabytes input standard inp ...

  3. Core 定时任务之HangFire

    ASP.NET Core 使用 Hangfire 很简单,首先,Nuget 安装程序包 > install-package Hangfire -pre 然后ConfigureServices添加 ...

  4. 解决Idea的Generate Sources无法生成QueryDSL问题

    今天是2020年第一天在家办公,就出现了跟在公司不一样的现象,deploy项目到maven库时失败,之前一直成功. 查到原因在于QueryDSL类没有生成,但为何在公司可以而在家里就不行呢? 鉴于Id ...

  5. P4452 [国家集训队]航班安排(最大费用最大流)

    P4452 [国家集训队]航班安排 题目传送门 解题思路: 感觉题面让人有很多误解,就是说有k架飞机在0点从0号机场起飞,在t时刻返回机场,给出空载飞行的时间和花费以及m个包机请求的花费和起始时间和终 ...

  6. Python里的装饰器

    装饰器 装饰器是干什么用的? 装饰器可以在不修改某个函数的情况下,给函数添加功能. 形象点来说,从前有一个王叔叔,他一个人住在家里,每天打扫家,看书.于是定义如下一个函数: def uncle_wan ...

  7. vue2.x中子组件修改父组件通过pops传递过来的值

    首先,父组件向子组件传值 这里面主要是在传值的时候,加上.sync 然后子组件通过 $emit 修改 如此即可完成对父组件的数据操作

  8. es学习(三):分词器介绍以及中文分词器ik的安装与使用

    什么是分词 把文本转换为一个个的单词,分词称之为analysis.es默认只对英文语句做分词,中文不支持,每个中文字都会被拆分为独立的个体. 示例 POST http://192.168.247.8: ...

  9. 8、OSPF

    OSPF ---最短路径优先 用于在单一自治系统(Autonomous System-AS)内决策路由 自制系统(AS)AS: 执行统一路由策略的一组网络设备的组合可适应大规模的网络: ·    路由 ...

  10. LoadRunner随机数

    需求:自定义随机数 方法: int randomnumber; randomnumber = rand()%+; //100到300的随机数 lr_output_message("ca:%d ...