Rust基本数据类型

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

概述

Rust内置的原生类型 (primitive types) 有以下几类

  • 数值类型分为有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 以及浮点数 (f32, f64)。
  • 布尔类型有两个值true和false。
  • 字符类型表示单个Unicode字符存储为4个字节。
  • 字符串类型最底层的是不定长类型str更常用的是字符串切片&str和堆分配字符串String 其中字符串切片是静态分配的有固定的大小并且不可变而堆分配字符串是可变的。
  • 数组具有固定大小并且元素都是同种类型可表示为[T; N]。
  • 切片引用一个数组的部分数据并且不需要拷贝可表示为&[T]。
  • 元组具有固定大小的有序列表每个元素都有自己的类型通过解构或者索引来获得每个元素的值。
  • 指针最底层的是裸指针const T和mut T但解引用它们是不安全的必须放到unsafe块里。
  • 函数具有函数类型的变量实质上是一个函数指针。
  • 元类型即()其唯一的值也是()。

数值类型

整数类型

Rust支持的整数类型如下

长度有符号整数无符号整数
8i8u8
16i16u16
32i32u32
64i64u64
128i128u128
archisizeusize

整数字面量可以使用前缀 0x、0o和0b 分别表示十六进制、八进制和二进制。为了让长数值更容易认读可以在数字间插入下划线。比如可以把最大的u32 值写成 4_294_967_295。在哪里插入下划线都无所谓因此对于十六进制或二进制数值也可以每 4 位插一个下划线比如 0xffff_ffff。或者也可以用下划线将数字与类型后缀分开比如 127_u8。

浮点类型

Rust 支持 IEEE单、双精度浮点类型。遵循 IEEE 754-2008 标准这些类型包含正、负无穷区分正、负零还有一个非数值not-a-number值

fn main() {

let x = 2.0; // f64Rust默认使用f64浮点类型

let y: f32 = 3.0; // f32
}

布尔类型

Rust中的布尔类型有两个可能的值 true 和 中的布尔类型使用 bool 表示。例如

fn main() { 
    let t = true;
    let f: bool = false; // 显式指定类型注解
}

Rust对bool值的使用比较严格if和while等控制结构要求它们的条件必须是bool表达式逻辑操作符&&和||同样也是如此。

字符类型

Rust的char类型的大小为4个字节表示了一个Unicode字符。Rust使用char类型表示单个字符但对字符串或文本流使用UTF-8编码。因此String将其文本表示为一个UTF-8字节的序列而不是字符的数组。Rust的char类型是语言中最原生的字母类型例如

fn main() {
    let c = 'z';
    let z = 'ℤ';
    let heart_eyed_cat = 'ᛀ';
}

Rust 还是提供了字节字面量byte literal即用类字符字面量表示的u8 值b’X’ 表示 ASCII 编码的字符 X它是一个 u8 值。比如由于字符 A的ASCII 编码是 65因此 b’A’ 等于 65u8。字节字面量中只能出现 ASCII 编码的字符。

复合类型

复合类型可以将多个值组合成一个类型。Rust 有两个原生的复合类型 元组tuple和数组array。

元祖

元组tuple由 2 个、3 个、4 个……各种类型的值组成而且每个元素都可以是一个不同的类型。元组的写法是把逗号分隔的元素序列放在一对圆括号里。元组长度固定一旦声明其长度不会增大或缩小。

fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);
}

数组

另一个包含多个值的方式是 数组array。与元组不同数组中的每个元素的类型必须相同。Rust 中的数组是固定长度的一旦 声明它们的长度不能增长或缩小。

fn main() {
    let a: [i32; 5] = [1, 2, 3, 4, 5];
}

如果你希望创建一个每个元素都相同 的数组可以在中括号内指定其初始值后跟分号再后跟数组的长度如下所示

let a = [3; 5];

数组是一整块分配在栈上的内存。可以使用索引来访问数组的元素。注意Rust 要求数组索引必须是 usize 值。

指针类型

Rust语言包含3种指针类型引用、Box智能指针和原始指针。

引用

Rust支持两种类型的引用

  • &T不可变引用
  • &mut T可变引用

Box智能指针

Rust在堆上分配一个值的最简单方式就是使用Box例如

let t = (12, "eggs");
let b = Box::new(t); //在堆中分配一个元组

转移是Rust处理分配到堆上的值的根本方式。

原始指针

Rust包含两种原始指针类型*const T和*mut T。

字符串类型

Rust 字符串就是 Unicode 字符序列但它在内存中不是以 char 数组的形式存储的。事实上字符串在内存中使用 UTF-8 可变宽度编码存储。字符串中的每个 ASCII 字符用 1 个字节存储其他字符则占用多个字节。字符串字面量放在一对双引号中。需要使用反斜杠转义的情形跟 char 字面量相同

let speech = "\"Ouch!\" said the well.\n";

与 char 字面量不同的是在字符串字面量中单引号无须转义双引号需要转义。

字节字符串

字节字符串byte string就是带有前缀b的字符串字面量。字节字符串是u8值即字节的切片不是Unicode 文本的切片

let method = b"GET";
assert_eq!(method, &[b'G', b'E', b'T']);

字节字符串可以使用我们刚刚看到的所有字符串语法可以跨多行、使用转义序列、使用反斜杠连接行。原始字节字符串以 br" 开头。字节字符串不能包含任意 Unicode 字符只能是 ASCII和\xHH 转义序列。

相关参考

  • 《Rust程序设计语言》
  • 《Rust程序设计》
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6