Rust 数据类型使用注意点


前言

Rust 学习系列 ,学习rust的数据类型。牢记其中的注意点📢


一、Rust 的数据类型

Rust 提供了丰富的数据类型,包括基本数据类型和复合数据类型。

基本数据类型:

  1. 布尔类型(bool):表示 true 或 false。
  2. . 字符类型(char):表示单个 Unicode 字符。
  3. 数值类型:
    • 整数类型(i8、i16、i32、i64、i128、isize):有符号整数。
    • 无符号整数类型(u8、u16、u32、u64、u128、usize):无符号整数。
    • 浮点数类型(f32、f64):单精度和双精度浮点数。

复合数据类型:

  1. 数组(array):固定大小的相同类型元素的集合。
  2. 元组(tuple):固定大小的不同类型元素的集合。
  3. 切片(slice):动态大小的数组引用。
  4. 字符串(string):动态大小的 UTF-8 字符串。
  5. 结构体(struct):自定义数据类型,可以包含多个字段。
  6. 枚举(enum):定义一个类型的取值集合。
  7. 特定用途的数据类型:例如 Option、Result<T, E> 等。

在这里插入图片描述

在这里插入图片描述

除了这些基本和复合数据类型,Rust 还提供了一些高级数据类型和特性,如引用、生命周期、泛型、trait 等,用于更灵活地处理数据。这些数据类型和特性使得 Rust 具有强大的类型系统和内存安全性。

来一些代码示例练习一波⚽️

fn main() {
    // 声明和初始化变量
    let number: i32 = 42;
    let is_true: bool = true;
    let letter: char = 'a';
    let array: [i32; 3] = [1, 2, 3];
    let tuple: (i32, bool) = (10, false);

    // 使用变量
    println!("The number is: {}", number);
    println!("Is it true? {}", is_true);
    println!("The letter is: {}", letter);
    println!("The array is: {:?}", array);
    println!("The tuple is: {:?}", tuple);

    // 使用引用
    let reference: &i32 = &number;
    println!("The reference is: {}", reference);
    
     let mut number2: i32 = 42;
    let mutable_reference: &mut i32 = &mut number2;
    *mutable_reference += 1;
    println!("The mutable reference is: {}", mutable_reference);
}
 

二、使用注意点📢

  1. 变量绑定:在声明变量时,需要指定变量的数据类型。Rust的类型推导功能可以自动推断变量的数据类型,但在某些情况下需要明确指定类型。

  2. 不可变和可变性:Rust中默认情况下,变量是不可变的。如果需要修改变量的值,需要使用mut关键字声明可变变量。

  3. 所有权系统:Rust的所有权系统是其最重要的特性之一。它规定了变量在内存中的所有权和使用规则。在Rust中,每个值都有一个所有者,并且只能有一个所有者。所有权可以通过移动(move)或借用(borrow)的方式转移。移动所有权规定了变量在传递给函数时的所有权转移,而借用所有权规定了变量在引用(borrow)时的限制。这个所有权系统可以避免内存安全问题和数据竞争。

  4. 引用:Rust中的引用(Reference)是指对变量的借用,它允许通过引用访问变量的值,但不允许修改变量的值。引用在函数传参和数据共享等场景下非常有用。

  5. 字面量和类型转换:Rust中的字面量可以直接表示特定类型的值,例如整数、浮点数和布尔值等。如果需要将一个类型转换为另一个类型,可以使用as关键字进行类型转换。

  6. 枚举和结构体:Rust提供了枚举(Enum)和结构体(Struct)两种复合数据类型。枚举用于表示一组相关的值,而结构体用于表示一组相关的字段。

整型溢出

比方说有一个 u8 ,它可以存放从 0 到 255 的值。那么当你将其修改为范围之外的值,比如 256,则会发生整型溢出(integer overflow),这会导致两种行为的其中一种。当在调试(debug)模式编译时,Rust 会检查整型溢出,若存在这些问题则使程序在编译时 panic。Rust 使用 panic 这个术语来表明程序因错误而退出。第 9 章 “panic! 与不可恢复的错误”会详细介绍 panic。

在当使用 --release 参数进行发布(release)模式构建时,Rust 不检测会导致 panic 的整型溢出。相反当检测到整型溢出时,Rust 会进行一种被称为二进制补码包裹(two’s complement wrapping)的操作。简而言之,大于该类型最大值的数值会被“包裹”成该类型能够支持的对应数字的最小值。比如在 u8 的情况下,256 变成 0,257 变成 1,依此类推。程序不会 panic,但是该变量的值可能不是你期望的值。依赖整型溢出包裹的行为不是一种正确的做法。

要显式处理溢出的可能性,可以使用标准库针对原始数字类型提供的以下一系列方法:

使用 wrapping_* 方法在所有模式下进行包裹,例如 wrapping_add
如果使用 checked_* 方法时发生溢出,则返回 None 值
使用 overflowing_* 方法返回该值和一个指示是否存在溢出的布尔值
使用 saturating_* 方法使值达到最小值或最大值


总结

Rust 数据类型的介绍,其中介绍数据使用需要特别注意的点

更多内容请参考
https://rustwiki.org/zh-CN/book/ch03-02-data-types.html

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值