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

rust变量

一 、变量定义

(一)语法格式
使用let关键字定义变量

let varname: type = value;
如,let a: i32 = 78;

也可以不显式指定类型

let varname = value;
如,let a = 78;

一些例子

1.布尔
let t = true;
let f: bool = false;2.整数
let a = 7u8;
let b = 32i32;
let c: i32 = 10_000;
let d = 0xffi32;3.小数
let x = 2.0; // f64
let y: f32 = 3.0; // f324.字符
let c = 'z';
let z: char = 'ℤ'; 
let heart_emoji: char = '❤';5.字符串
let a = "foobar";
let b = r#""foo""#;

(二)变量可变性
Rust变量分为可变的与不可变的:
在默认情况下是不可变的。如果需要可变,那需要加 mut 关键字。

let mut varname = value;

(三)静态变量
语法格式

static mut? IDENTIFIER : Type ( = Expression )? ;

必须为静态变量提供初始化表达式,但在外部块中的静态变量必须省略初始化表达式。
初始化表达式是常量表达式。可以引用其他静态变量。

例子

static mut LEVELS: u32 = 0;

(四)常量
常量类似于不可变变量,但是常量和不可变变量之间存在一些差异:
变量的值是在运行时确定的,而常量的值是在编译期确定的。
不允许对常量使用 mut
声明常量使用 const 关键字而不是 let,并且 必须 注明类型。
常量只能初始化为常量表达式,而不可以是在运行时才计算出的值。这是因为 常量 只是一个符号,会在 编译时 替换为具体的值,这个有点类似于C语言中的 #define 定义的符号。

比如,

const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;

常量的名称是 THREE_HOURS_IN_SECONDS,Rust对常量的命名约定是在单词之间使用全大写加下划线。
它的值为60(一分钟内的秒数)乘以60(一小时内的分钟数)再乘以3(小时数)的结果。
编译器能够在编译时做简单的计算,这使我们可以选择表达式,而不是直接使用10800。

(五)隐藏
可以定义一个与之前变量同名的新变量。
第二个变量隐藏了或者说遮蔽了第一个变量,此时使用该变量名都是在使用第二个变量,直到第二个变量被隐藏或第二个变量的作用域结束。
可以重复使用 let 关键字来多次隐藏。

比如,

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}");
}
运行结果
The value of x in the inner scope is: 12
The value of x is: 6

隐藏的好处
1.可以在重新计算之后,依然保持变量不可变。
2.可以改变变量类型。
常用在需要转换类型的场景。它允许我们复用变量的名字,而不是被迫创建两个不同变量。

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

第一个 spaces 变量是字符串类型,第二个 spaces 变量是数字类型。隐藏使我们不必使用不同的名字,如 spaces_str 和 spaces_num;相反,我们可以复用 spaces 这个更简单的名字。然而,如果尝试使用 mut,将会编译错误。如下所示:

let mut spaces = " ";
spaces = spaces.len();//这个错误,我们不能改变变量的类型

(六)作用域
作用域是一个项有效的范围
变量的作用域从其声明开始,一直延伸到包含它的代码块的末尾。在作用域结束后,变量将被销毁并释放其占用的内存。

fn main() {// 代码块1{// 定义一个变量,作用域在代码块1内let x: i32 = 5;println!("The value of x is {}", x);} // 变量x在这里被销毁// 代码块2{// 定义另一个变量,作用域在代码块2内let y: i32 = 10;println!("The value of y is {}", y);} // 变量y在这里被销毁
}

二、变量使用

定义之后,就可以直接用变量名使用变量
例子

let x: i32 = 5;
println!("The value of x is {}", x);     //直接使用x这个名字
http://www.lryc.cn/news/185927.html

相关文章:

  • 蓝桥杯---第一讲 递归与递推
  • OpenCV 15(SIFT/SURF算法)
  • 前端二维码图片解析图片识别/网络图片解析成链接/图片网络链接转本地链接(Js/Vue/Jquery)
  • 模板中的依赖类型使用 --- typename
  • git 同时配置 gitee github
  • 2023.10.8 面试
  • 【前端】js实现队列功能 先进后出 先进先出 等
  • 07.数据持久化之文件操作
  • nginx开启https配置之后网页无法访问问题处理
  • 文本嵌入层
  • 如何搭建自动化测试框架
  • 抄写Linux源码(Day17:你的键盘是什么时候生效的?)
  • 在原生html中使用less
  • 【Qt】顶层窗口和普通窗口区别以及用法
  • qt开发从入门到实战2
  • Android---字节码层面分析Class类文件
  • 【2023研电赛】东北赛区一等奖作品:基于FPGA的小型水下无线光通信端机设计
  • JWT授权为啥要在 Authorization标头里加个Bearer 呢
  • 一篇理解TCP协议
  • rk平台android12系统设置里面互联网选项中的以太网选项点击不了问题
  • ctrl+d和ctrl+c的区别
  • ChatGLM2-6B微调实践
  • YOLOv7独家改进FPN系列:结合新颖的 GhostSlimPAN 范式网络结构,进一步提升检测器性能
  • 12. Java异常及异常处理处理
  • 自定义hooks函数
  • Linux系统及Docker安装RabbitMq
  • 山东省赛二阶段第一部分解题思路
  • WebGoat 靶场 JWT tokens 四 五 七关通关教程
  • 【单元测试】如何使用 JUnit5 框架?
  • C#封装、继承和多态的用法详解