当前位置: 首页 > news >正文

Rust 变量基础知识

文章目录

  • 发现宝藏
  • 1. Rust变量与可变性
  • 2. 变量与常量
  • 3. 变量隐藏(shadowing)

发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。

1. Rust变量与可变性

在 Rust 编程语言中,变量的可变性质是理解 Rust 关键特性的核心之一。Rust 是一种强调安全和并发的语言,其变量系统设计旨在提供最大程度的内存安全性,同时允许程序员高效地控制资源。

1. 不可变变量

Rust 中的变量默认是不可变的。这意味着一旦你为一个变量绑定了一个值,你就不能再改变它。例如:

let x = 5;

在这个例子中,x 的值是 5,且你不能再给 x 赋予其他值。如果尝试修改它,例如:

x = 10;  // 这是一个编译错误

编译器会报错,因为 Rust 强调不可变性能提高代码的可靠性和减少错误。

2.可变变量

如果需要改变变量的值,Rust 提供了一个机制来显式声明变量为可变。通过在 let 绑定前加上 mut 关键字,可以创建一个可变变量。例如:

let mut y = 10;
y = 20;  // 这是合法的

这里,y 的初始值是 10,但之后被重新赋值为 20。这个 mut 关键字明确表示 y 的值可以改变,从而允许在程序运行时修改它的值。

3.不可变性与多线程

Rust 的不可变性不仅有助于单线程代码的稳定性,还能增强多线程编程的安全性。不可变变量可以被多个线程安全地共享,因为不会有线程修改其值。这减少了数据竞争的风险,是 Rust 的所有权和借用系统的核心部分。

2. 变量与常量

在 Rust 编程语言中,变量和常量是存储数据的两种方式,它们在不可变性和使用方式上有明显区别。了解这些区别对于写出清晰且高效的 Rust 代码至关重要。以下是关于 Rust 中常量(const)的一些关键点:

1. 常量 (constant) 的特点

  • 不可变性

    常量在定义后其值是不可变的。与不可变变量类似,常量一旦绑定了值,就不能再改变。常量不能使用 mut 关键字,因为它们永远都是不可变的。

  • 声明方式

    常量使用 const 关键字进行声明,并且必须显式指定类型。例如:

    const MAX_POINTS: u32 = 100_000;
    

    这里 MAX_POINTS 是一个常量,其值为 100,000,并且类型为 u32

  • 作用域

    常量可以在任何作用域中声明,包括全局作用域。它们的作用范围不限于定义所在的代码块。

  • 绑定到常量表达式

    常量只能绑定到常量表达式,而不能绑定到函数的返回值或需要在运行时才能计算出的值。例如:

    const PI: f64 = 3.141592653589793;
    

    PI 绑定到一个常量表达式。常量表达式是在编译时就能确定的值。

  • 命名规范

    Rust 约定常量使用全大写字母,并用下划线分隔每个单词,例如:MAX_POINTS。这种命名规范有助于区分常量和变量。

  • 示例代码

// 定义常量
const MAX_POINTS: u32 = 100_000;
const PI: f64 = 3.141592653589793;fn main() {// 使用常量println!("Max points: {}", MAX_POINTS);println!("Value of PI: {}", PI);
}

在上面的示例中,MAX_POINTSPI 是常量,其值在程序编译时就已确定,并在整个作用域内保持不变。常量的这种特性使得它们非常适合用于定义那些不会改变的固定值,例如数学常数、配置参数等。

理解常量的这些特性和使用规范,有助于在 Rust 中编写清晰且可靠的代码,确保数据的稳定性和一致性。

3. 变量隐藏(shadowing)

在 Rust 编程语言中,变量隐藏(shadowing)是一种非常有用的特性,它允许使用相同的名字声明新的变量,从而“隐藏”之前的同名变量。这种机制与变量的可变性(通过 mut 关键字)是不同的,并且在代码中具有独特的作用。

1. 什么是变量隐藏(Shadowing)

在 Rust 中,变量隐藏(shadowing)指的是重新声明一个与之前变量同名的新变量。这个新变量会遮盖(或隐藏)之前声明的同名变量。在后续代码中,使用的将是新的变量,而不是之前的变量。

2. Shadowing 的特点

  • 重新声明

    变量隐藏通过使用 let 关键字重新声明一个与之前变量同名的变量来实现。例如:

    let x = 5;
    let x = x + 1;
    

    在这个例子中,第一次声明的 x 的值是 5。第二次使用 let 重新声明 x,新的 x 将是之前 x 的值加 1,即 6。这样,新的 x 隐藏了之前的 x

  • 作用域

    变量隐藏的作用范围仅限于重新声明后的代码块。也就是说,新的变量在其声明后的代码中有效,而之前的变量在这段代码中变得不可见。

  • 不可变性

    使用变量隐藏声明的新变量是不可变的,除非在新变量的声明中明确使用 mut 关键字。例如:

    let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("The value of x is: {}", x);  // 输出 12
    

    在这个例子中,x 的值依次变为 6 和 12,新的 x 隐藏了之前的 x

  • mut 的不同

    变量隐藏与将变量标记为 mut(可变)是不同的。如果你标记一个变量为 mut,你可以修改这个变量的值,而变量隐藏则是通过声明新的同名变量来实现值的改变,而不是修改原有变量的值。例如:

    let mut x = 5;
    x = x + 1;  // 修改原有变量的值
    

    在上面的代码中,x 是可变的,可以通过直接赋值来修改其值。

  • 示例代码

下面的代码演示了变量隐藏的基本用法:

fn main() {let x = 5;println!("The value of x is: {}", x); // 输出 5let x = x + 1;println!("The value of x after shadowing is: {}", x); // 输出 6let x = x * 2;println!("The value of x after another shadowing is: {}", x); // 输出 12
}

在这个例子中,第一次打印显示 x 的值为 5。第二次打印显示新的 x 的值为 6,第三次打印显示新的 x 的值为 12。每次使用 let 关键字重新声明 x 时,新的 x 隐藏了之前的 x

  • 变量隐藏的使用场景

    • 简化代码:变量隐藏可以帮助你在需要的地方简化代码。特别是在处理复杂的计算或临时变量时,使用隐藏可以让代码更清晰。
    • 避免不必要的 mut:通过使用变量隐藏,可以避免使用 mut 关键字,从而保持不可变性的优点,确保代码的可靠性。

变量隐藏(shadowing)是 Rust 提供的一个强大功能,它允许使用相同的名字声明新的变量,并通过新的值隐藏之前的变量。这种机制不仅帮助简化代码,也与变量的可变性(mut)机制有所区别,使得 Rust 编程更加灵活和强大。理解和掌握变量隐藏的用法,可以提高你的代码质量,并让你的程序更加健壮。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何彻底清除电脑上的数据?保护你的隐私安全
  • 阿里云服务器 篇八:图片展示和分享网站(纯静态,数据信息和展示页面分离)
  • 关于RabbitMQ消息丢失的解决方案
  • 怎么修复松下相机死机视频只有0字节(0KB)的MDT文件【实测可修复】
  • 《深度学习》OpenCV 高阶 图像直方图、掩码图像 参数解析及案例实现
  • [论文笔记] CSFCN
  • Python 入门教程(3)基础知识 | 3.1、基础语法
  • 即插即用篇 | YOLOv10 引入矩形自校准模块RCM | ECCV 2024
  • Macbook增加扩展屏待机重开后软件界面错乱问题解决方案
  • 【vue3|第28期】 Vue3 + Vue Router:探索路由重定向的使用与作用
  • Ready Go
  • rust学习笔记
  • 【QT】系统-上
  • 相机雷达标定
  • 【rpg像素角色】俯视角-行走动画
  • __proto__ 和 prototype的关系
  • Akka系列(七):Actor持久化之Akka persistence
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • HashMap ConcurrentHashMap
  • HashMap剖析之内部结构
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • MySQL主从复制读写分离及奇怪的问题
  • npx命令介绍
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vue 动态创建 component
  • 阿里云购买磁盘后挂载
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 规范化安全开发 KOA 手脚架
  • 山寨一个 Promise
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 数据科学 第 3 章 11 字符串处理
  • 微信开放平台全网发布【失败】的几点排查方法
  • 微信开源mars源码分析1—上层samples分析
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一些css基础学习笔记
  • 用mpvue开发微信小程序
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • const的用法,特别是用在函数前面与后面的区别
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • #Linux(Source Insight安装及工程建立)
  • $$$$GB2312-80区位编码表$$$$
  • (1)无线电失控保护(二)
  • (Forward) Music Player: From UI Proposal to Code
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二)JAVA使用POI操作excel
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (论文阅读11/100)Fast R-CNN
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转载)Google Chrome调试JS
  • (转载)PyTorch代码规范最佳实践和样式指南