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. 让现有vue前端项目快速支持多语言 - 用.net core程序快速替换中文为资源Key,咱不干体力活

    前言 最近应公司上层要求,需要将现有项目尽快支持多语言,而中文内容可以找专业人员翻译.那么咱们说干就干,首先我们项目的前端是用vue写的spa程序且组件方面用的element ui,那么自然而然想到用 ...

  2. python3函数进阶

    1.命名空间和作用域 命名空间     加载         内置命名空间             python解释器自带的变量和函数             开启python解释器自动加载内置命名空 ...

  3. python 判断文件的字符编码

    import chardet f = open(file='test1.txt', mode='rb') data = f.read() print(chardet.detect(data))

  4. mysql 自增

    auto_increment 在创建表的时候,可以设置id为自增 # 查看表现在的自增值 show create table blog \G; # 设置自增值的初始值 alter table blog ...

  5. Java入门 - 语言基础 - 04.对象和类

    原文地址:http://www.work100.net/training/java-object-class.html 更多教程:光束云 - 免费课程 对象和类 序号 文内章节 视频 1 概述 2 J ...

  6. Flsak学习笔记(1)

    Day 01 最近项目里要用python写后端,同学推荐了flask框架就来学一学.写这个博客的目的主要是记录一下自己学习的内容,有基础知识忘了不用一个个去百度,还有就是跟大家分享一下,有不是很容易理 ...

  7. 在eclipse中用java调用python报错 Exception in thread "main" ImportError: Cannot import site module and its dependencies

    最近做项目需要用java调用python,配置了jython后,运行了例子代码: 获得一个元组里面的元素: import org.python.util.PythonInterpreter; publ ...

  8. 使用Razor表达式 举数组和集合 精通ASP-NET-MVC-5-弗瑞曼

  9. python接口自动化测试 - configparser配置文件解析器详细使用

    configparser简介 ConfigParser模块已在Python 3中重命名为configparser 该模块定义了ConfigParser类. ConfigParser类实现一种基本的配置 ...

  10. GP工作室——系统设计

    团队作业第二次--系统设计 问题 答案 这个作业属于哪个课程 软件工程 这个作业要求在哪里 作业要求 团队名称 GP工作室 这个作业的目标 对项目软件进行更为详细的系统性设计 按照本游戏的设计要求,我 ...