当前位置:首页 > 科技  > 软件

Rust编程基础之变量与可变性

来源: 责编: 时间:2023-10-31 10:26:26 460观看
导读1.Rust变量在Rust语言中, 变量默认是不可改变的(immutable), 这是Rust提供给我们的众多优势之一, 让我们可以充分利用Rust提供的安全性和简单并发性来编写代码。当变量不可变时, 一旦值被绑定在一个名称上, 就不能改

1.Rust变量

在Rust语言中, 变量默认是不可改变的(immutable), 这是Rust提供给我们的众多优势之一, 让我们可以充分利用Rust提供的安全性和简单并发性来编写代码。tcw28资讯网——每日最新资讯28at.com

当变量不可变时, 一旦值被绑定在一个名称上, 就不能改变这个值。下面是一段代码的例子:tcw28资讯网——每日最新资讯28at.com

fn main() {    let x = 1;    println!("The value of x is: {x}");    x = 2;    println!("The value of x is: {x}");}

这段代码如果是其它高级语言, 看不出有什么问题, 定义了一个变量,先赋值1,然后打印输出, 再将该值赋值2, 再打印该值的内容。tcw28资讯网——每日最新资讯28at.com

但如果你使用的是支持Rust开发语言的IDE, 在这段代码中会给出一个错误标识, 将鼠标移到上面,会看到一段错误提示,如图:tcw28资讯网——每日最新资讯28at.com

图片图片tcw28资讯网——每日最新资讯28at.com

错误含义就是不可多次为一个不可变的变量赋新值。tcw28资讯网——每日最新资讯28at.com

如果我们使用Rust自带的编译器进行编译, Rust会很贴心的告诉我们错误在哪个位置, 错误的原因, 错误怎么纠正,如图:tcw28资讯网——每日最新资讯28at.com

图片图片tcw28资讯网——每日最新资讯28at.com

在上图的提示中, Rust编译器建议我们想改变变量的值, 应该在let后面加上mut关键字, 这样变量就可以被改变了。tcw28资讯网——每日最新资讯28at.com

修改代码如下:tcw28资讯网——每日最新资讯28at.com

fn main() {    let mut x = 1;    println!("The value of x is: {x}");    x = 2;    println!("The value of x is: {x}");}

再次编译, 可以看到已经正确打印了变量内容,如图:tcw28资讯网——每日最新资讯28at.com

图片图片tcw28资讯网——每日最新资讯28at.com

2.Rust常量

类似于不可变变量, 常量(constants)是绑定到一个名称的不允许改变的值, 不过常量和变量还是有一定的区别。tcw28资讯网——每日最新资讯28at.com

首先, 不允许对常量使用mut, 常量不仅默认不可变, 而且总是不可变。声明常量使用const关键字而不是let, 并且必须注明值的类型。tcw28资讯网——每日最新资讯28at.com

常量可以在任何作用域中声明,包括全局作用域, 这在一个值需要被很多部分的代码用到时很有用。tcw28资讯网——每日最新资讯28at.com

最后一个区别是,常量只能被设置为常量表达式,而不可以是其它任何只能在运行时计算出的值。tcw28资讯网——每日最新资讯28at.com

以下是一个常量的声明例子:tcw28资讯网——每日最新资讯28at.com

const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 *3;

常量的名称是 THREE_HOURS_IN_SECONDS,它的值被设置为 60(一分钟内的秒数)乘以 60(一小时内的分钟数)再乘以 3(我们在这个程序中要计算的小时数)的结果。Rust 对常量的命名约定是在单词之间使用全大写加下划线。编译器能够在编译时计算一组有限的操作,这使我们可以选择以更容易理解和验证的方式写出此值,而不是将此常量设置为值 10,800。tcw28资讯网——每日最新资讯28at.com

在声明它的作用域之中,常量在整个程序生命周期中都有效,此属性使得常量可以作为多处代码使用的全局范围的值,例如一个游戏中所有玩家可以获取的最高分或者光速。tcw28资讯网——每日最新资讯28at.com

将遍布于应用程序中的硬编码值声明为常量,能帮助后来的代码维护人员了解值的意图。如果将来需要修改硬编码值,也只需修改汇聚于一处的硬编码值。tcw28资讯网——每日最新资讯28at.com

3.隐藏

在Rust中,我们可以定义一个与之前变量同名的新变量, 在这种情况下, 称之为第一个变量被第二个隐藏(Shadowing)了, 这意味着当我们使用变量的名称时, 编译器将看到第二个变量。实际上,第二个变量“遮蔽”了第一个变量,此时任何使用该变量名的行为中都会视为是在使用第二个变量,直到第二个变量自己也被隐藏或第二个变量的作用域结束。可以用相同变量名称来隐藏一个变量,以及重复使用let关键字来多次隐藏。tcw28资讯网——每日最新资讯28at.com

看一段下面的代码:tcw28资讯网——每日最新资讯28at.com

fn main() {    let x = 5;    let x = x + 1;    {        // 进入隐藏作用域        let x = x * 2;        println!("The value of x in the inner scope is: {x}");    }    println!("The value of x is: {x}");}

我们先在代码下个断点, 通过调试状态观察变量值的情况,如图:tcw28资讯网——每日最新资讯28at.com

图片图片tcw28资讯网——每日最新资讯28at.com

从上图中可以看到, 进入花括号作用域后, x 经过计算已经变成了12, 所以第一个打印的应该是12。tcw28资讯网——每日最新资讯28at.com

如果出了作用域会怎样呢, 继续单步走一下退出作用域,如图:tcw28资讯网——每日最新资讯28at.com

图片图片tcw28资讯网——每日最新资讯28at.com

可以看到, 出了作用域之后, X的值又变成了6, 因此第二个打印语句的结果就是6。tcw28资讯网——每日最新资讯28at.com

因此最终输出如下:tcw28资讯网——每日最新资讯28at.com

图片图片tcw28资讯网——每日最新资讯28at.com

隐藏与将变量标记为 mut 是有区别的。当不小心尝试对变量重新赋值时,如果没有使用 let 关键字,就会导致编译时错误。通过使用 let,我们可以用这个值进行一些计算,不过计算完之后变量仍然是不可变的。tcw28资讯网——每日最新资讯28at.com

mut 与隐藏的另一个区别是,当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字。例如,假设程序请求用户输入空格字符来说明希望在文本之间显示多少个空格,接下来我们想将输入存储成数字(多少个空格):tcw28资讯网——每日最新资讯28at.com

let spaces = " ";let spaces = spaces.len();

第一个 spaces 变量是字符串类型,第二个 spaces 变量是数字类型。隐藏使我们不必使用不同的名字,如 spaces_str 和 spaces_num;相反,我们可以复用 spaces 这个更简单的名字。然而,如果尝试使用 mut,将会得到一个编译时错误,如下所示:tcw28资讯网——每日最新资讯28at.com

let mut spaces = " ";spaces = spaces.len();

错误提示如下:tcw28资讯网——每日最新资讯28at.com

图片图片tcw28资讯网——每日最新资讯28at.com

4.总结

在本篇文章中, 我们学到以下知识点:tcw28资讯网——每日最新资讯28at.com

  • Rust变量定义及可变性、不可变性的灵活应用。
  • Rust常量的基本作用域和命名规则。
  • Rust变量的隐藏属性规则、原理和应用。

本文链接:http://www.28at.com/showinfo-26-16026-0.htmlRust编程基础之变量与可变性

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 开源推荐! 一款开箱即用的电子签名组

下一篇: Go的异步编程:使用Futures与Promises

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 不容错过的MSBuild技巧,必备用法详解和实践指南

    一、MSBuild简介MSBuild是一种基于XML的构建引擎,用于在.NET Framework和.NET Core应用程序中自动化构建过程。它是Visual Studio的构建引擎,可在命令行或其他构建工具中使用
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事“起猛了,我能看得懂日语了”。“为什么日本人说话我能听懂?”“中文不像中文,日语不像日语,但是我竟然看懂了”…&hell
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
Top