004、变量与可变性

2023-12-31 13:20
文章标签 变量 004 可变性

本文主要是介绍004、变量与可变性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 变量与可变性

        在Rust中,变量默认是不可变的,这一设计是为了让你安全方便地写出复杂、甚至是并行的代码。

        当然,Rust也提供了可使用的可变变量的方法,这个待会讨论。

        当一个变量是不可变时,一旦它被绑定到某个值上面,这个值就再也无法被改变。下面是一段错误的演示代码:

fn main() {let x = 5;println!("x的值为:{x}");x = 10;println!("x的值为:{x}");
}

        使用 cargo run 命令运行代码后发现报错了。红线处报错内容的中文意思是:不能为不可变变量分配两次。

        Rust的编译器能够保证那些声明为不可变的值一定不会发生变化,意味着你不需要去跟踪一个变量会如何变化, 这样的好处就是代码逻辑更好理解和推导。

        接下来我们讲一下如何使变量可变,很简单,就是在变量名之前加个 mut 关键字就行了。给变量加了这个关键字就表示,接下来的代码或者其它代码可能会改变这个变量的值。

        所以,要使上面的错误代码正确运行,只需要在第一次声明变量 x 的时候在名称前加上一个 mut 关键字就行了,像下面这样:

fn main() {let mut x = 5;println!("x的值为:{x}");x = 10;println!("x的值为:{x}");
}

        修改后的代码运行结果如下:

        关于可变变量,这里再补充一点。

        除了避免出现bug,设计一个变量的可变性还需要考虑其他因素。比如,当你在使用某些重型数据结构时,适当地使用可变性去修改一个实例,可能比赋值和重新返回一个新分配的实例更有效率。

        当数据结构较为轻小时,采用偏向于函数式的风格,通过创建新变量来进行赋值,可能会使代码可读性更高。在类似这样的情境下,损失少许性能也许是值得的。

2. 变量与常量之间的区别

         在Rust中,也有常量的概念,它和不可变变量的特性一样,绑定到常量上的值无法被其他代码修改,但两者的区别肯定是有的。

        首先,不能用 mut 关键字来修饰一个常量。因为常量不仅是默认不可变,而且总是不可变。

        其次,声明一个常量用的是 const 关键字而不是 let,而且在声明的同时你必须显式地标注出值的类型。关于数据类型,我们下篇文章马上会讲到。现在你只需要记住一点:常量总是需要标注类型的。

        再次,常量可以在任何作用域中声明,甚至包括全局作用域。这在一个值需要被不同部分的代码共同引用时十分有用。

        最后,你只能将常量绑定到一个常量表达式上,而无法将一个函数的返回值,或其它需要在运行时计算的值绑定到常量上。

        下面举一个声明常量的例子:

const MAX_POINTS: u32 = 100_000;

        代码中,我们使用 const 关键字声明了一个变量 MAX_POINTS,指定类型为 u32,即:无符号的32位整数。

        这个常量的名称我是全大写然后中间用下划线连接,这个是Rust中约定俗成的,不是强制性的,而变量、函数名是全小写然后中间下划线连接,都是为了提高代码的可读性。当然,你也可以使用其它命名法,比如驼峰式。

        然后它的值是 100_000,就是 一百万的意思。这个中间的下划线也是为了提高代码可读性,你可以理解为千分位分隔符。

3. 隐藏

        隐藏(Shadow),是 Rust 中的一个概念,即:一个新声明的变量可以覆盖掉旧的同名变量,用 Rust 的说法就是:第一个变量被第二个新变量隐藏(Shadow)了。

        这意味着后面我们使用这个变量时,它指向的是新变量了。当然,我们可以重复使用 let 关键字并使用相同的变量名称来不断隐藏之前的变量。

        代码举例:

fn main() {let x = 5;let x = 5 + 1;let x = x * 2;println!("x的最终值为:{x}");
}

        运行结果如下图所示,虽然我们得到了12,但是出现了代码提示和警告。

        代码提示:help: if this is intentional, prefix it with an underscore: `_x`,中文意思是,帮助:如果这是故意的,请在它前面加一个下划线:`_x` 。

        这个 `_x`  是什么意思呢?在Rust中,下划线_是一个特殊的标识符,被称为 “下划线” 或 “忽略” 模式匹配。它通常用于在模式匹配中忽略某个变量。

        由于我们多次覆盖变量x的值,所以触发了这个提示。当你看到这个提示时,它是在告诉你,如果你故意想忽略一个变量或值,你可以使用下划线作为前缀。

        warning: `variables` (bin "variables") generated 1 warning (run `cargo fix --bin "variables"` to apply 1 suggestion)

        这个警告的中文意思是,`variables'(bin“variables”)生成1个警告(运行`cargo fix--bin“variable”`应用1个建议)。这表明虽然你的代码能够成功编译并运行,但有一些潜在的问题或不推荐的做法,比如,未使用的变量、未使用的导入、过时的 API 使用等。这些警告通常会建议你采取一些行动来改进你的改码。

        若要解决这个问题,你可以按照警告信息的建议,运行 cargo fix 命令。这个命令会自动应用Rust编译器提供的建议来修复源代码中的一些问题。我们来运行试一下:

cargo fix --bin "variables"

        当然,如果你的黑窗口已经在项目目录下,可以只要写 cargo fix 就行了。 

        在Rust中,cargo fix 是一个非常有用的命令,它可以帮助开发者自动修复编译器中的警告。从 Rust 1.29 版本开始,cargo fix 作为子命令被加入到 cargo 工具中。

        当你运行cargo fix时,它会分析你的代码并尝试自动修复那些编译器发出警告的问题。这些问题可能包括代码风格问题、潜在的错误和不推荐的用法等。cargo fix 尝试使用最新的修复方法来解决这些问题,使你的代码更符合最佳实践和官方推荐的代码风格。

        例如,假设你的代码中存在一些未使用的变量或导入,这可能会导致编译警告。运行 cargo fix 后,它会尝试自动删除这些未使用的变量或导入,从而消除警告。

        关于隐藏我们再来举个例子,示例代码如下:

fn main() {let spaces = "    ";let spaces = spaces.len();println!("spaces的值为:{}", spaces);
}

        这段代码能正常运行,是因为 spaces 在第一次声明时是字符串类型,而第二次声明的 spaces 虽然名称和第一次一样,但是它表示的是第一个 spaces 的长度,是一个数值变量。

        隐藏机制允许我们复用变量名称,而不需要做出区分。如果我们去掉第二次声明的代码中的 let 关键字会怎样?就会出现下面的报错内容。

        因此,如果要覆盖之前的变量,一定是带着 let 关键字哦 ~ 

4. 结语

        下一篇文章,将详细向你介绍Rust中的 数据类型,前面遇到的 u32,你就会知道是什么意思啦 ~

        由于能力有限、本人也还在学习摸索阶段,文中难免有错漏之处,若有读者大大发现,欢迎在评论区留言。

        最后,码字不易,即便只有一个赞也可以让我动力满满,感谢你的支持!

这篇关于004、变量与可变性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/556148

相关文章

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

JS_变量

二、JS的变量 JS中的变量具有如下特征 1 弱类型变量,可以统一声明成var 2 var声明的变量可以再次声明 3 变量可以使用不同的数据类型多次赋值 4 JS的语句可以以; 结尾,也可以不用;结尾 5 变量标识符严格区分大小写 6 标识符的命名规则参照JAVA 7 如果使用了 一个没有声明的变量,那么运行时会报uncaught ReferenceError: *** is not de

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

axure之变量

一、设置我们的第一个变量 1、点击axure上方设置一个全局变量a = 3 2、加入按钮、文本框元件点击按钮文档框展示变量值。 交互选择【单击时】【设置文本】再点击函数。 点击插入变量和函数直接选择刚刚定义的全局变量,也可以直接手动写入函数(注意写入格式。) 这样点击按钮时就直接展示刚刚设置的全局变量3了。 2、更改变量值 在新建交互里点击设置变量值。 将a变量设置成等于10. 将新

shell脚本中变量中字符串替换的测试 /和//的区别

test_char=abbbcbbbf echo "bf:test_char = " $test_char test_char=${test_char/bbb/ddd} echo "af:test_char = " $test_char 输出: bf:test_char =  abbbcbbbf af:test_char =  adddcbbbf 只匹配第一个

eclipse中相同变量显示变色设置

java文件的设置"Window"-"preferences"-"Java"-"Editor"-"Mark Occurrences"复选框勾选 js文件的设  置"Window"-"preferences"-"web"-"javascript"-"Mark Occurrences"复选框勾选 。

Python学习1--变量和简单数据

经过这一段时间的学习,将Python相关的知识点记录下来,好记性不如烂笔头嘛。 本文主要参考了《Python编程从入门到实践》以及唐宇迪老师的教程《Python快速入门视频课程》,然后在博主http://www.cnblogs.com/liubinsh/p/6937409.html的基础上总结而成,特此感谢! 第二章 变量和简单数据类型 什么是变量 这里的message就是变量,

配置JAVA环境的时候,环境变量中administrator的用户变量和系统变量的区别?

迁移项目到新的服务器上: 需要Java运行环境时,经常要配置环境变量,如图所示 这里有administrator的用户变量(U),和系统变量(S), 那么,它们之间有什么区别呢? 简单的说,一个是当前用户使用,你用其它用户登陆,这个环境变量就不起作用了。 系统变量,是对所有用户都可使用的。 简单的说: 系统变量:不管以哪个用户名登陆到计算机都能使

不设临时变量交换a,b的值

常规的做法: int tmp = a; a = b; b = tmp; 不设中间变量的方法: a = a + b; b = a - b; a = a - b;

【C/C++】变量命名规范

在 C++ 中,为 bool 类型的变量命名时,通常遵循以下命名规范,以确保代码的可读性和一致性: 表示状态或条件: 使用 is 前缀表示某个状态或条件,例如 isReady、isValid。使用 has 前缀表示是否拥有某个属性,例如 hasData、hasError。使用 can 前缀表示是否具备某种能力,例如 canExecute、canRead。使用 should 前缀表示是否应该执行