Rust 数据类型

2 阅读3分钟

Rust 是一种静态类型语言,这意味着在编译时就必须明确每个变量的类型。Rust 提供了丰富的数据类型,可分为基本数据类型和复合数据类型。

基本数据类型

整数类型

整数类型表示没有小数部分的数字。Rust 提供了多种整数类型,根据位数和有无符号进行区分。

长度有符号无符号
8 位i8u8
16 位i16u16
32 位i32u32
64 位i64u64
128 位i128u128
视架构而定isizeusize

示例代码:

fn main() {
    let a: i32 = 42; 
    let b: u8 = 255; 
    println!("a: {}, b: {}", a, b); 
} 

浮点类型

Rust 有两种浮点类型,即 f32(单精度)和 f64(双精度)。默认情况下,浮点数字面量会被推断为 f64 类型。 示例代码:

fn main() { 
    let x: f32 = 3.14;
    let y = 2.71828;
    // 推断为 f64 类型
    println!("x: {}, y: {}", x, y);
}

布尔类型

布尔类型只有两个可能的值:truefalse,使用 bool 表示。 示例代码:

fn main() {
    let is_valid: bool = true; 
    println!("Is valid: {}", is_valid); 
} 

字符类型

Rust 的 char 类型用于表示单个 Unicode 标量值,使用单引号括起来。 示例代码:

fn main() {
    let c: char = 'A'; 
    let emoji: char = '😀'; 
    println!("c: {}, emoji: {}", c, emoji);
} 

复合数据类型

元组类型

元组是将多个不同类型的值组合在一起的复合类型,其长度固定。 示例代码:

fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1); 
    let (x, y, z) = tup; 
    // 解构元组 
    println!("x: {}, y: {}, z: {}", x, y, z); 
    // 也可以通过索引访问元组元素 
    println!("tup.0: {}", tup.0); 
} 

数组类型

数组是一组相同类型的值的集合,其长度也是固定的。 示例代码:

fn main() { 
    let a: [i32; 5] = [1, 2, 3, 4, 5]; 
    println!("a[0]: {}", a[0]); // 初始化所有元素为相同值 
    let b = [3; 5]; // 创建一个包含 5 个元素,每个元素值为 3 的数组 
    println!("b: {:?}", b);
} 

自定义数据类型

结构体类型

结构体允许你将多个相关的字段组合在一起,形成一个自定义的数据类型。 示例代码:

struct User {
    username: String, 
    email: String, 
    sign_in_count: u64, 
    active: bool, 
} 
fn main() { 
    let user1 = User { 
        email: String::from("someone@example.com"),
        username: String::from("someusername123"), 
        active: true, sign_in_count: 1, 
    }; 
    println!("User email: {}", user1.email); 
} 

枚举类型

枚举类型允许你定义一组可能的值。 示例代码:

enum IpAddrKind { 
    V4, V6, 
} 
struct IpAddr { 
    kind: IpAddrKind, 
    address: String, 
} 
fn main() { 
    let home = IpAddr { 
        kind: IpAddrKind::V4, 
        address: String::from("127.0.0.1"), 
    };
    println!("Home IP address: {}", home.address); 
} 

类型推断与类型注解

Rust 编译器通常能够根据上下文推断出变量的类型,但在某些情况下,你可能需要显式地提供类型注解。 示例代码:

fn main() { 
    let num = 42; // 类型推断为 i32 
    let num_with_annotation: u32 = 42; // 显式类型注解 
} 

通过这些丰富的数据类型,Rust 为开发者提供了强大的类型系统,有助于编写安全、高效的代码。