Rust常见编程概念

守听  金牌会员 | 2024-3-21 10:08:07 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 892|帖子 892|积分 2676

目录

本文大部分内容来自官方文档,对于一些基础常识的内容做了删减,适合已经掌握其它编程语言的人查阅,原文档内容参考常见编程概念

变量和可变性

变量默认是不可变的,可以在变量名前添加 mut 来使其可变。
示例代码:
  1. fn main() {
  2.     //let x = 5; 默认不可变,编译报错
  3.     let mut x = 5;
  4.     println!("The value of x is: {x}");
  5.     x = 6;
  6.     println!("The value of x is: {x}");
  7. }
复制代码
常量

类似于不可变变量,常量 (constants)是绑定到一个名称的不允许改变的值,常量与变量的区别:

  • 不允许对常量使用 mut,常量不光默认不可变,它总是不可变。
  • 声明常量使用 const 关键字而不是 let,并且必须注明值的类型
  • 常量可以在任何作用域中声明,包括全局作用域。
  • 常量只能被设置为常量表达式,而不可以是其他任何只能在运行时计算出的值。
示例代码:
  1. const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
复制代码
Rust 对常量的命名约定是在单词之间使用全大写加下划线,编译器能够在编译时计算一组有限的操作。
在声明它的作用域之中,常量在整个程序生命周期中都有效,将硬编码值声明为常量有助于后期代码维护。
隐藏

可以用相同变量名称来隐藏一个变量,以及重复使用 let 关键字来多次隐藏,如下所示:
  1. fn main() {
  2.     //将 x 绑定到值 5 上
  3.     let x = 5;
  4.     //创建了一个新变量 x
  5.     let x = x + 1;
  6.     {
  7.         //创建了一个新变量 x
  8.         let x = x * 2;
  9.         println!("The value of x in the inner scope is: {x}");
  10.         //输出 The value of x in the inner scope is: 12
  11.     }
  12.     println!("The value of x is: {x}");
  13.     //输出 The value of x is: 6
  14. }
复制代码
隐藏与将变量标记为 mut 是有区别的

  • 对变量重新赋值时不使用 let 关键字会导致编译时错误,通过使用 let 可以用这个值进行一些计算,计算完之后变量仍然是不可变的
  • 当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字,例如:
  1. //字符串类型
  2. let spaces = "   ";
  3. //数字类型
  4. let spaces = spaces.len();
复制代码
隐藏使我们不必使用不同的名字,如 spaces_str 和 spaces_num。
下面这种代码会报错,不能改变变量的类型:
  1. let mut spaces = "   ";
  2. spaces = spaces.len();
复制代码
注:不要滥用隐藏特性,被隐藏变量和新变量尽量处于同一个作用域
数据类型

每一个值都属于某一个 数据类型(data type),有两类数据类型子集:标量(scalar)复合(compound)
Rust 是 静态类型(statically typed)语言,编译时就必须知道所有变量的类型。
根据值及其使用方式,编译器通常可以推断出我们想要用的类型:

当多种类型均有可能时必须增加类型注解,例如:
  1. let guess: u32 = "42".parse().expect("Not a number!");
复制代码
标量类型

标量(scalar)类型代表一个单独的值,Rust 有四种基本的标量类型:整型浮点型布尔类型字符类型
整型

整数 是一个没有小数部分的数字,Rust 内建的整数类型如下:
长度有符号无符号8-biti8u816-biti16u1632-biti32u3264-biti64u64128-biti128u128archisizeusize可以使用其中的任一个来声明一个整数值的类型,类型取值范围如下(n 是变体使用的位数):

  • 有符号的变体可以储存包含从 -(2ⁿ⁻¹) 到 2ⁿ⁻¹ - 1 的数字,如 i8 可以储存从 -(2⁷) 到 2⁷ - 1 的数字,也就是从 -128 到 127。
  • 无符号的变体可以储存从 0 到 2ⁿ - 1 的数字,如 u8 可以储存从 0 到 2⁸ - 1 的数字,也就是从 0 到 255。
  • isize 和 usize 类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的,32 位架构上它们是 32 位的。
可以使用下表中的任何一种形式编写数字字面值:
数字字面值例子Decimal (十进制)98_222Hex (十六进制)0xffOctal (八进制)0o77Binary (二进制)0b1111_0000Byte (单字节字符)(仅限于u8)b'A'

  • 可以是多种数字类型的数字字面值允许使用类型后缀,例如 57u8 来指定类型;
  • 允许使用 _ 做为分隔符以方便读数,例如1_000 的值与 1000 相同。
如果不知道使用哪种类型的数字,可以使用 Rust 的默认类型,数字类型默认是 i32isize 或 usize 主要作为某些集合的索引
关于整型溢出的处理:

  • 当在 debug 模式编译时,Rust 检查这类问题并使程序 panic,这个术语被 Rust 用来表明程序因错误而退出。
  • 使用 --release flag 在 release 模式中构建时,Rust 不会检测会导致 panic 的整型溢出。发生整型溢出时会进行二进制补码操作,值 256 变成 0,值 257 变成 1,依此类推。
为了显式地处理溢出的可能性,可以使用这几类标准库提供的原始数字类型方法:

  • 所有模式下都可以使用 wrapping_* 方法进行 wrapping,如 wrapping_add
  • 如果 checked_* 方法出现溢出,则返回 None值
  • 用 overflowing_* 方法返回值和一个布尔值,表示是否出现溢出
  • 用 saturating_* 方法在值的最小值或最大值处进行饱和处理
浮点型

Rust 也有两个原生的 浮点数(floating-point numbers)类型,分别是 f32f64,分别占 32 位和 64 位,默认类型是 f64
  1. fn main() {
  2.     let x = 2.0; // f64
  3.     let y: f32 = 3.0; // f32
  4. }
复制代码
浮点数采用 IEEE-754 标准表示,f32 是单精度浮点数,f64 是双精度浮点数
注:Rust 中的所有数字类型都支持基本数学运算:加法、减法、乘法、除法和取余,整数除法会向零舍入到最接近的整数
布尔型

Rust 中的布尔类型有两个可能的值:true 和 false,使用 bool 表示:
  1. fn main() {
  2.     let t = true;
  3.     let f: bool = false;
  4. }
复制代码
字符类型

Rust 的 char 类型是语言中最原生的字母类型:
[code]fn main() {    //单引号声明 char 字面量,双引号声明字符串字面量    let c = 'z';    let z: char = 'ℤ';     let heart_eyed_cat = '
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表