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

Rust 学习笔记 - 变量声明与使用

前言

任何一门编程语言几乎都脱离不了:变量、基本类型、函数、注释、循环、条件判断,这是一门编程语言的语法基础,只有当掌握这些基础语法及概念才能更好的学习 Rust。

变量介绍

Rust 是一种强类型语言,但在声明变量时,不总是需要显式声明类型,这是因为 Rust 的编译器有类型推断系统。当声明一个变量而没有指定类型时,Rust 编译器会根据变量的初始值自动推断出它的类型。

在强类型语言中,每个变量和常量都必须有一个明确的类型,而且类型在编译时就已经确定。Rust 编译器非常严格,不允许不同类型的数据隐式转换。如果需要将一个类型转换为另一个类型,必须使用明确的类型转换方法。这一特性使得 Rust 在编译时能够提供类型检查,有助于避免许多常见的运行时错误。

不可变变量 (Immutable)

与其他编程语言(如:Java、Python、JS)不同,默认情况下 Rust 中的变量是不可变的 (神奇,变量不可变🤔)。

这一特性意味着变量一旦被赋值后,在变量的整个生命周期内它的值就不能被改变,尝试修改一个不可变变量的值会导致编译时错误。

示例:

let x = 5;
x = 6; // 这会导致编译错误,因为 x 是不可变的

可变变量 (Mutable)

  • 通过使用 mut 关键字,可以声明一个可变的变量,这样的变量允许其值在后续被修改。
  • 但需要注意,rust 作为强类型语言,修改变量时不允许赋值其他类型的值

示例:

let mut x = 5;
x = 6; // 这是允许的,因为 x 是可变的// error[E0308]: mismatched types
x = 3.1415926; // 3.1415926 是浮点数,x 声明时是整形

变量遮蔽(Shadowing)

变量遮蔽是 Rust 中的一个特性,有些文档或教程将 Shadowing 称为:隐藏重影,它允许在相同作用域中,使用相同的名称声明一个新变量。这个新声明的变量“遮蔽”了先前声明的同名变量。更准确地说,当新变量被引入时,它会使得与之同名的先前变量不再可见,直到新变量离开作用域前,无法访问被遮蔽的变量。这与变量重新赋值不同,因为它实际上是在创建一个全新的变量。

遮蔽的好处是可以重新使用更有意义或适用于当前上下文的变量名,遮蔽通常用于转换值的类型或给变量一个新值,而这样做并不影响原来变量的不可变性。

示例1:

let x = 5;
let x = x + 1; // 遮蔽前一个 x 变量
let x = "现在 x 是一个字符串"; // 再次遮蔽,改变了值的类型

示例2:

fn main() {let x = 5;let x = x + 1;{// 在使用花括号创建的内部作用域内,变量 `x` 被遮蔽let x = x * 2;println!("x 在当前作用域的值是: {x}"); // 12}// 当作用域结束后,内部 shadowing 的作用域也结束了,`x` 又返回到 `6`println!("x 在当前作用域的值是: {x}"); // 6
}

常量 (Constants)

  • 常量使用 const 关键字声明,并且它们总是不可变的。
  • 常量必须在声明时就赋值,而且它们的类型必须显式声明。
  • 常量名应该全部大写,否则会报警告。

示例:

const MAX_POINT: u32 = 100_000;

不可变变量 与 常量的区别

在 Rust 中,虽然不可变变量和常量都不能在声明后被修改,但它们之间存在几个主要区别:

类型标注

  • 声明常量时,必须显式给出类型标注
  • 不可变变量通常可以依赖 Rust 的类型推断,类型标注是可选的。

示例:

// ok!
let x = 1000;
// error: missing type for `const` item
const CONST_VAL = 1000; 

值的赋予时机

  • 常量在编译时被赋值,且必须是一个恒定的表达式,不能是运行时的结果。
  • 不可变变量可以在运行时被初始化,其中的值可以是在运行时才能确定的表达式的结果。

示例1:

fn get_val() -> i32 {1000
}fn main() {// ok!let x = get_val(); // const 不能接收运行时的结果// error[E0015]: cannot call non-const fn `get_val` in constantsconst CONST_VAL: i32 = get_val(); 
}

示例2:

fn main() {// let 允许先声明,后赋值let x;x = 1000; // error: free constant item without bodyconst CONST_VAL: i32; // error[E0070]: invalid left-hand side of assignmentCONST_VAL = 1000;
}

变量遮蔽

  • 不可变变量可以通过变量遮蔽进行重新赋值
  • 常量无法进行变量遮蔽,相同常量名重复定义时会报错

示例:

    let x = 1000;// ok!let x = "str";const CONST_VAL: i32 = 1000;//  // error[E0428]: the name `CONST_VAL` is defined multiple timesconst CONST_VAL: &str = "str";

作用域

  • let 关键字用于在局部作用域中声明变量,如函数或代码块内部,而不能用于全局作用域。
  • const 关键字可以用于全局作用域中声明常量,也可以在局部作用域中使用。

示例:

const GLOBAL_CONST: i32 = 10; // 全局常量,可以在整个程序中访问// error: expected item, found keyword `let`
// let x = 1000; // 不允许声明全局变量
fn main() {let local_var = 5; // 局部变量,只能在 main 函数内访问println!("常量: {}", GLOBAL_CONST);println!("局部变量: {}", local_var);
}fn another_function() {// local_var 在这里是不可见的,因为它不在作用域内// GLOBAL_CONST 仍然是可见的println!("同一个常量: {}", GLOBAL_CONST);
}

结语

本文深入介绍了 Rust 中的变量声明,特别是它独有的不可变变量变量遮蔽特性。相较于其它编程语言,这些概念初看可能会给变量操作带来复杂性。然而,随着使用的深入,这些概念将变得清晰明了,你将发现它们实际上是 Rust 强大功能和安全性的体现,而且并不复杂。

相关文章:

Rust 学习笔记 - 变量声明与使用

前言 任何一门编程语言几乎都脱离不了:变量、基本类型、函数、注释、循环、条件判断,这是一门编程语言的语法基础,只有当掌握这些基础语法及概念才能更好的学习 Rust。 变量介绍 Rust 是一种强类型语言,但在声明变量时&#xf…...

windows 下跑起大模型(llama)操作笔记

原贴地址:https://testerhome.com/topics/39091 前言 国内访问 chatgpt 太麻烦了,还是本地自己搭一个比较快,也方便后续修改微调啥的。 之前 llama 刚出来的时候在 mac 上试了下,也在 windows 上用 conda 折腾过,环…...

人工智能专题:基础设施行业智能化的基础设施,自智网络双价值分析

今天分享的是人工智能系列深度研究报告:《人工智能专题:基础设施行业智能化的基础设施,自智网络双价值分析》。 (报告出品方:埃森哲) 报告共计:32页 自智网络驱动的电信产业变革 经过多年的…...

docker 编译安装redis脚本

在Docker中编译安装Redis通常不是一个常见的做法,因为Redis官方提供了预编译的Docker镜像,这些镜像包含了已经编译好的Redis二进制文件。不过,如果你有特殊需求,想要自己从源代码编译Redis并打包成Docker镜像,你可以使…...

鸿蒙开发系列教程(二十三)--List 列表操作(2)

列表样式 1、设置内容间距 在列表项之间添加间距,可以使用space参数,主轴方向 List({ space: 10 }) { … } 2、添加分隔线 分隔线用来将界面元素隔开,使单个元素更加容易识别。 startMargin和endMargin属性分别用于设置分隔线距离列表侧…...

C#根据权重抽取随机数

(游戏中一个很常见的简单功能,比如抽卡抽奖抽道具,或者一个怪物有多种攻击动作,按不同的权重随机出个攻击动作等等……) 假如有三种物品 A、B、C,对应的权重分别是A(50)&#xff0c…...

SORA:OpenAI最新文本驱动视频生成大模型技术报告解读

Video generation models as world simulators:作为世界模拟器的视频生成模型 1、概览2、Turning visual data into patches:将视觉数据转换为补丁3、Video compression network:视频压缩网络4、Spacetime Latent Patches:时空潜在…...

阿里云第七代云服务器ECS计算c7、通用g7和内存r7配置如何选择?

阿里云服务器配置怎么选择合适?CPU内存、公网带宽和ECS实例规格怎么选择合适?阿里云服务器网aliyunfuwuqi.com建议根据实际使用场景选择,例如企业网站后台、自建数据库、企业OA、ERP等办公系统、线下IDC直接映射、高性能计算和大游戏并发&…...

视觉slam十四讲学习笔记(六)视觉里程计 1

本文关注基于特征点方式的视觉里程计算法。将介绍什么是特征点,如何提取和匹配特征点,以及如何根据配对的特征点估计相机运动。 目录 前言 一、特征点法 1 特征点 2 ORB 特征 FAST 关键点 BRIEF 描述子 3 特征匹配 二、实践:特征提取…...

PyTorch-线性回归

已经进入大模微调的时代&#xff0c;但是学习pytorch&#xff0c;对后续学习rasa框架有一定帮助吧。 <!-- 给出一系列的点作为线性回归的数据&#xff0c;使用numpy来存储这些点。 --> x_train np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],[9.779], [6.1…...

C++数据结构与算法——栈与队列

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…...

掌上新闻随心播控,HarmonyOS SDK助力新浪新闻打造精致易用的资讯服务新体验

原生智能是HarmonyOS NEXT的核心亮点之一&#xff0c;依托HarmonyOS SDK丰富全面的开放能力&#xff0c;开发者只需通过几行代码&#xff0c;即可快速实现AI功能。新浪新闻作为鸿蒙原生应用开发的先行者之一&#xff0c;从有声资讯入手&#xff0c;将基于Speech Kit朗读控件上线…...

2024年危险化学品经营单位主要负责人证模拟考试题库及危险化学品经营单位主要负责人理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品经营单位主要负责人证模拟考试题库及危险化学品经营单位主要负责人理论考试试题是由安全生产模拟考试一点通提供&#xff0c;危险化学品经营单位主要负责人证模拟考试题库是根据危险化学品经营单位主…...

C/C++如何把指针所指向的指针设为空指针?

实践出真知&#xff0c;指针对于初学的友友来说&#xff0c;头都要大了。喵喵一直遵循在实践中学&#xff0c;在学习中实践&#xff0c;相信你也会有所得&#xff01; 以下是该问题的解决方案&#xff1a; int** ptrPtr new int*; // 创建指向指针的指针 int* ptr new int;…...

第三节:基于 InternLM 和 LangChain 搭建你的知识库(课程笔记)

视频链接&#xff1a;https://www.bilibili.com/video/BV1sT4y1p71V/?vd_source3bbd0d74033e31cbca9ee35e111ed3d1 文档地址&#xff1a; https://github.com/InternLM/tutorial/tree/main/langchain 课程笔记&#xff1a; 1.仅仅包含训练时间点之前的数据&#xff0c;无法…...

qt-C++笔记之打印所有发生的事件

qt-C笔记之打印所有发生的事件 code review! 文章目录 qt-C笔记之打印所有发生的事件1.ChatGPT问答使用 QApplication 的 notify 方法使用 QObject 的 event 方法 2.使用 QObject 的 event 方法3.使用 QApplication 的 notify 方法 1.ChatGPT问答 在Qt C中&#xff0c;若要打…...

pytorch 实现线性回归(深度学习)

一 查看原始函数 初始化 %matplotlib inline import random import torch from d2l import torch as d2l 1.1 生成原始数据 def synthetic_data(w, b, num_examples):x torch.normal(0, 1, (num_examples, len(w)))y torch.matmul(x, w) bprint(x:, x)print(y:, y)y tor…...

[Doris] Doris的安装和部署 (二)

文章目录 1.安装要求1.1 Linux操作系统要求1.2 软件需求1.3 注意事项1.4 内部端口 2.集群部署2.1 操作系统安装要求2.2 下载安装包2.3 解压2.4 配置FE2.5 配置BE2.6 添加BE2.7 FE 扩容和缩容2.8 Doris 集群群起脚本 3.图形化 1.安装要求 1.1 Linux操作系统要求 1.2 软件需求 1…...

【QT+QGIS跨平台编译】之三十五:【cairo+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、cairo介绍二、文件下载三、文件分析四、pro文件五、编译实践一、cairo介绍 Cairo是一个功能强大的开源2D图形库,它提供了一套跨平台的API,用于绘制矢量图形和文本。Cairo支持多种输出目标,包括屏幕、图像文件、PDF、SVG等。 Cairo的设计目标是简单易用、高效…...

MySQL(基础)

第01章_数据库概述 1. 为什么要使用数据库 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大多…...

STM32F1 - 中断系统

Interrupt 1> 硬件框图2> NVIC 中断管理3> EXTI 中断管理3.1> EXTI与NVIC3.2> EXTI内部框图 4> 外部中断实验4.1> 实验概述4.2> 程序设计 5> 中断向量表6> 总结 1> 硬件框图 NVIC&#xff1a;Nested Vectored Interrupt Controller【嵌套向量…...

【Linux系统化学习】缓冲区

目录 缓冲区 一个样例 现象解释 缓冲区存在的位置 缓冲区 在刚开始学习C语言的时候我们就听过缓冲区这个名词&#xff0c;很是晦涩难懂&#xff1b;在Linux下进程退出时也包含缓冲区&#xff0c;因此缓冲区到底是什么&#xff1f;有什么作用&#xff1f; 让我们先从一个小…...

基于BP算法的SAR成像matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 BP算法的基本原理 4.2 BP算法的优点与局限性 5.完整工程文件 1.课题概述 基于BP算法的SAR成像。合成孔径雷达&#xff08;SAR&#xff09;是一种高分辨率的雷达系统&#xff0c;能够在各种天气和光…...

【C++ STL】你真的了解string吗?浅谈string的底层实现

文章目录 底层结构概述扩容机制浅拷贝与深拷贝插入和删除的效率浅谈VS和g的优化总结 底层结构概述 string可以帮助我们很好地管理字符串&#xff0c;但是你真的了解她吗&#xff1f;事实上&#xff0c;string的设计是非常复杂的&#xff0c;拥有上百个接口&#xff0c;但最常用…...

17.3.1.3 灰度

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 灰度的算法主要有以下三种&#xff1a; 1、最大值法: 原图像&#xff1a;颜色值color&#xff08;R&#xff0c;G&#xff0c;B&a…...

基于CAS操作的atomic原子类型

在上一节的卖票程序中&#xff0c;我们讲解了如何在多线程中保证临界资源的正确访问——使用互斥锁&#xff0c;即 lock_guard<mutex> lock(mtx); count;lock_guard<mutex> lock(mtx); count--; 从汇编角度解释线程间互斥-mutex互斥锁与lock_guard的使用-CSDN博客…...

Rust HashMap详解及单词统计示例

在Rust中&#xff0c;HashMap是一种非常有用的数据结构&#xff0c;用于存储键值对。本文将深入介绍HashMap的特性&#xff0c;以及通过一个单词统计的例子展示其用法。 HashMap简介 HashMap是Rust标准库提供的用于存储键值对的数据结构。它允许通过键快速查找对应的值&#…...

命令执行讲解和函数

命令执行漏洞简介 命令执行漏洞产生原因 应用未对用户输入做严格得检查过滤&#xff0c;导致用户输入得参数被当成命令来执行 命令执行漏洞的危害 1.继承Web服务程序的权限去执行系统命会或读写文件 2.反弹shell&#xff0c;获得目标服务器的权限 3.进一步内网渗透 远程代…...

外包实在是太坑了,划水三年,感觉人都废了

先说一下自己的情况&#xff0c;专科生&#xff0c;19年通过校招进入杭州某个外包软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了3年的功…...

代码随想录算法训练营第19天

77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 class Solution:def combine(self, n: int, k: int) -> List[List[int]]:path []res []def dfs(n,k,index):if len(path) k:res.append(path[:])returnfor i in range(index,n1):…...