欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > Rust编程语言入门教程 (六)变量与可变性

Rust编程语言入门教程 (六)变量与可变性

2025/2/23 1:24:42 来源:https://blog.csdn.net/yoona333/article/details/145713673  浏览:    关键词:Rust编程语言入门教程 (六)变量与可变性

Rust 系列

🎀Rust编程语言入门教程(一)安装Rust🚪
🎀Rust编程语言入门教程(二)hello_world🚪
🎀Rust编程语言入门教程(三) Hello Cargo🚪
🎀Rust编程语言入门教程(四)猜数游戏:一次猜测🚪
🎀Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测🚪
🎀Rust编程语言入门教程 (六)变量与可变性🚪
🎀Rust编程语言入门教程 (七)函数与控制流🚪

目录

  • Rust 系列
  • 引言
  • 一、变量与可变性
  • 二、变量与常量
    • shadowing
  • 三、标量和复合类型
    • (一) 标量类型
      • ①整数类型(默认类型 i32)
      • ②浮点类型 (默认 f64)
      • ③布尔类型
      • ④字符类型
    • (二)复合类型
      • ①元组(Tuple)
      • ②数组
  • 总结

引言

在 Rust 中,变量默认是不可变的,这种设计有助于防止程序中的意外修改,从而提高代码的安全性和可维护性。通过使用 mut 关键字,可以将变量声明为可变,从而允许在程序运行时修改其值。此外,Rust 提供了常量、标量类型(如整数、浮点数、布尔值和字符)以及复合类型(如元组和数组),这些特性为开发者提供了灵活而强大的工具来构建高效、安全的程序。

一、变量与可变性

声明变量使用 let 关键字默认情况下,变量是不可变的 (Immutable)
不可变的变量不能进行二次赋值
在这里插入图片描述

运行cargo run
可以发现会报错的。
在这里插入图片描述

加上mut就好啦。声明变量时,在变量前面加上mut,就可以使变量可变
在这里插入图片描述

cargo run 运行 这个警告是说还没有引用 x 变量。
在这里插入图片描述

二、变量与常量

常量(constant),常量在绑定值以后也是不可变的,但它与不可变的变量有很多区别:

  • 不可以使用mut常量永远都是不可变的
  • 声明常量使用const 关键字,它的类型必须被标注
  • 常量可以在任何作用域内进行声明,包括全局作用域
  • 常量只可以绑定到常量表达式,无法绑定到函数的调用结果只能在运行时才能计算出的值

在程序运行期间,常量在其声明的作用域内一直有效。
命名规范: Rust 里常量使用全大写字母,每个单词之间用下划线分开,
例如:
MAX POINTS
const MAX_POINTS : u32 = 100_000; //下划线 _ 增强可读性

shadowing

可以使用相同的名字声明新的变量,新的变量就会 shadow(隐藏) 之前声明的同名变量

  • 在后续的代码中这个变量名代表的就是新的变量(例子)
  • shadow 把变量标记为 mut 是不一样的:
  • 如果不使用 let 关键字,那么重新给非 mut 的变量赋值会导致编译时错误,
    而使用 let 声明的同名新变量,也是不可变的.
  • 使用 let 声明的同名新变量,它的类型可以与之前不同
    在这里插入图片描述

三、标量和复合类型

Rust 是静态编译语言,在编译时必须知道所有变量的类型

  • 基于使用的值,编译器通常能够推断出它的具体类型
  • 但如果可能的类型比较多(例如把 String 转为整数的 parse 方法),就必须添加类型的标注,否则编译会报错。
  • 在这里插入图片描述
    这个 u32 是需要写的,不然编译器或者 parse 方法不知道 要把 “42” 字面值解析成哪种整数类型。

(一) 标量类型

一个标量类型代表一个单个的值Rust有四个主要的标量类型:

①整数类型(默认类型 i32)

  • 整数类型没有小数部分
  • 例如 u32就是一个无符号的整数类型,占据32位的空间
  • 无符号整数类型U开头
  • 有符号整数类型i 开头

Rust 的整数类型列表如图:
在这里插入图片描述

每种都分 i 和 u,以及固定的位数
有符号范围:
-(2的n次方 - 1)2的n次方 - 1
无符号范围:
0 2的n次方 - 1

isize 和 usize 类型
isize usize 类型的位数由程序运行的计算机的架构所决定:

  • 如果是64位计算机,那就是64位的
  • 使用 isize 或 usize的主要场景是对某种集合进行索引操作。

整数字面值

  • 除了byte 类型外,所有的数值字面值都允许使用类型后缀。
    例如 57 u8
  • 如果你不太清楚应该使用那种类型,可以使用Rust 相应的默认类型:
  • 整数的默认类型就是 i32
    总体上来说速度很快,即使在64位系统中。
    在这里插入图片描述

整数溢出

例如: u8 的范围是 0-255,如果你把一个 u8 变量的值设为 256,那么

  • 调试模式下编译: Rust 会检查整数溢出,如果发生溢出,程序在运行时就会 panic
  • 发布模式下 ( --release ) 编译: Rust不会检查可能导致 panic 的整数溢出
  • 如果溢出发生: Rust 会执行 “环绕” 操作:
    256 变成 0,257 变成 1 …
    但程序不会 panic。

②浮点类型 (默认 f64)

Rust有两种基础的浮点类型,也就是含有小数部分的类型

  • f32,32位,单精度
  • f64,64位,双精度

Rust 的浮点类型使用了IEEE-754标准来表述
f64 是默认类型,因为在现代 CPU 上 f64 和 f32 的速度差不多,而且精度更高

③布尔类型

Rust的布尔类型也有两个值: true 和 false
一个字节大小
符号是 pool

④字符类型

  • Rust 语言中 char 类型被用来描述语言中最基础的单个字符
  • 字符类型的字面值使用单引号
  • 占用4字节大小
  • 是 Unicode 标量值,可以表示比 ASCIl 多得多的字符内容:拼音、中日韩文、零长度空白字符、emoji 表情等。
  • U+0000 到 U+D7FF
  • U+E000 到 U+10FFFF
    但 Unicode 中并没有 “字符” 的概念,所以直觉上认为的字符也许与 Rust 中的概念并不相符。

(二)复合类型

复合类型可以将多个值放在一个类型里Rust 提供了两种基础的复合类型:

①元组(Tuple)

  • Tuple 可以将多个类型的多个值放在一个类型
  • Tuple 的长度是固定的:一旦声明就无法改变

创建 Tuple

  • 在小括号里,将值用逗号分开
  • Tuple 中的每个位置都对应一个类型,Tuple 中各元素的类型不必相同

x y z 分别对应 500,6.4, 1
在这里插入图片描述

访问 Tuple 的元素
在 tuple 变量使用点标记法,后接元素的索引号

在这里插入图片描述

②数组

  • 数组也可以将多个值放在一个类型
  • 数组中每个元素的类型必须相同
  • 数组的长度也是固定的: 一旦声明就无法改变

声明一个数组
在中括号里,各值用逗号分开。

数组的用处

  • 如果想让你的数据存放在stack(栈)上而不是 heap(堆)上,或者想保证有固定数量的元素,这时使用数组更有好处
  • 数组没有 Vector 灵活
  • Vector和数组类似,它由标准库提供
  • Vector 的长度可以改变
  • 如果你不确定应该用数组还是 Vector,那么估计你应该用 Vector。
  • 在这里插入图片描述

数组的类型
[类型:长度]
例如: let a: [i32; 5] = [1, 2, 3, 4, 5];

另一种声明数组的方法:
如果数组的每个元素值都相同,那么可以在在中括号里指定初始值,然后是一个“ ; ” ,最后是数组的长度
例如:let a = [3; 5]; 它就相当于:let a = [3, 3, 3, 3, 3];

访问数组的元素

  • 数组是 Stack上分配的单个块的内存
  • 可以使用索引来访问数组的元素
  • 如果访问的索引超出了数组的范围,那么:
    编译会通过
    运行会报错(runtime 时会panic)。
    Rust不会允许其继续访问相应地址的内存
    在这里插入图片描述

在这里插入图片描述

总结

Rust 的变量默认不可变,通过 mut 可使其可变,而常量则始终不可变。标量类型(如整数、浮点数、布尔值和字符)和复合类型(如元组和数组)为程序提供了丰富的数据结构支持。变量的 shadowing 机制和类型推断规则进一步增强了 Rust 的灵活性和安全性,使其成为现代系统编程语言中的佼佼者。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词