Rust学习笔记_03——元组

Rust学习笔记_01------基础
Rust学习笔记_02------数组


Rust学习笔记_03------元组

文章目录

  • Rust学习笔记_03------元组
    • 元组
      • [1. 定义元祖](#1. 定义元祖)
      • [2. 访问元组中的元素](#2. 访问元组中的元素)
      • [3. 元组的解构](#3. 元组的解构)
      • [4. 元组不可遍历和切片](#4. 元组不可遍历和切片)
      • [5. 元组作为函数返回值](#5. 元组作为函数返回值)
      • [6. 单元元组](#6. 单元元组)
      • [7. 代码演示](#7. 代码演示)

元组

在Rust编程语言中,元组(tuple)是一种固定大小的、异质的集合类型,可以包含不同类型的元素。元组在Rust中非常有用,尤其是在需要返回多个值或临时组合不同类型的数据时。

1. 定义元祖

你可以使用圆括号 () 来定义元组,并在其中用逗号 , 分隔不同的元素。

rust 复制代码
let tuple: (i32, f64, &str) = (1, 2.5, "hello");

Rust中的元组默认是不可变的(immutable),但你可以通过 mut 关键字来使其可变

rust 复制代码
let tuple_mut = (1, 2.5 'a')
tuple_mut.1 = 3.5
println!("{tuple_mut.1}")

2. 访问元组中的元素

rust 复制代码
let tuple = (1, 2.5, "hello");

let first = tuple.0;    // 访问第一个元素,i32 类型的 1
let second = tuple.1;   // 访问第二个元素,f64 类型的 2.5
let third = tuple.2;    // 访问第三个元素,字符串切片 "hello"

3. 元组的解构

rust 复制代码
let tuple = (1, 2.5, "hello");

// 解构元组
let (a, b, c) = tuple;

println!("a = {}, b = {}, c = {}", a, b, c);

4. 元组不可遍历和切片

  • Rust中的元组不能直接进行遍历。元组是一个固定长度的、可以包含不同类型元素的复合类型。不能使用for循环直接遍历元组,因为元组没有实现Iterator trait。
  • 元组也不能像数组那样进行切片操作。只能通过索引来访问元组中的单个元素,索引从0开始,使用点号(.)来访问,例如:tuple.0tuple.1等。
  • 如果你需要遍历或切片操作,有以下替代方案:
    1. 如果需要遍历,可以将元组转换为数组
    2. 如果元素类型相同,考虑使用数组或Vec替代元组
    3. 可以使用模式匹配来一次性获取多个元素

5. 元组作为函数返回值

元组可以作为函数返回值,一次返回多个值

rust 复制代码
fn calculate_area_and_perimeter(radius: f64) -> (f64, f64) {
    let area = 3.14159 * radius * radius;
    let perimeter = 2.0 * 3.14159 * radius;
    (area, perimeter)
}

let (area, perimeter) = calculate_area_and_perimeter(5.0);
println!("Area: {}, Perimeter: {}", area, perimeter);

6. 单元元组

单元元组是只有一个空元素的元组,写作 ()。它有时用于表示一个空的结果或状态。单元元组在类型上不同于空元组 ()(后者没有类型),单元元组的类型是 ()(注意这里的圆括号与空元组的圆括号含义不同,单元元组的类型 () 在类型系统中是有效的)。

7. 代码演示

rust 复制代码
fn tuple_demo() {
    // 创建不可变元组
    let tup_1 = (500, 6.4, 1);
    let tup_2: (char, char, char, u32) = ('a', 'b', 'c', 10000);

    // 创建可变元组
    let mut tup_3 = (500, 6.4, 1);
    // 修改元组中第二个元素的值,从1改为2
    tup_3.1 = 2.0;

    // 打印元组的值
    println!("tup_1: {}, {}, {}", tup_1.0, tup_1.1, tup_1.2);
    println!("tup_2: {}, {}, {}, {}", tup_2.0, tup_2.1, tup_2.2, tup_2.3);
    println!("tup_3: {}, {}, {}", tup_3.0, tup_3.1, tup_3.2);
  
  	// 元组访问示例
    let tuple = (1, "hello", 3.14);
    println!("First element: {}", tuple.0);
    println!("Second element: {}", tuple.1);
    println!("Third element: {}", tuple.2);

    //元组不能像数组一样进行遍历和切面

    // 使用match语句来处理元组
    match tup_1 {
        (x, y, z) => println!("x: {}, y: {}, z: {}", x, y, z),
    }

    let tuple = (1, "apple");
    match tuple {
        (1, "apple") => println!("Matched (1, \"apple\")"),
        (2, _) => println!("Matched (2, _)"), // _ 是一个通配符,匹配任意值
        (_, "banana") => println!("Matched (_, \"banana\")"), // 第一个元素可以是任意值
        _ => println!("Matched something else"), // 匹配所有其他情况
    }

    // 使用模式匹配解构元组
    let (x, y, z) = tuple;
    println!("x: {}, y: {}, z: {}", x, y, z);

    // 如果需要遍历,可以转换为数组(要求元素类型相同)
    let homogeneous_tuple = (1, 2, 3, 4, 5);
    let array = [homogeneous_tuple.0, homogeneous_tuple.1, homogeneous_tuple.2, homogeneous_tuple.3, homogeneous_tuple.4];
    
    // 现在可以遍历数组了
    for item in array.iter() {
        println!("Item: {}", item);
    }
}
相关推荐
圆奋奋4 小时前
FreeRTOS学习(十)- 最核心的内容:优先级抢占式调度 + 上下文切换
学习·freertos
程序猿炎义5 小时前
【llm-algo-leetcode学习笔记】显存与性能认知底座
笔记·学习·leetcode
SomeB1oody5 小时前
【RustyML入门】5.3. 聚类指标
开发语言·后端·机器学习·rust·教程
for_ever_love__5 小时前
python基础语法学习: 类型注解
开发语言·python·学习
摇滚侠5 小时前
《Docker技术入门与实战 第4版》阅读笔记 6 使用 Dockerfile 创建镜像 2
java·笔记·docker
树的枝5 小时前
【STM32】05.TIM定时器
笔记·stm32·单片机·嵌入式硬件
雾沉川5 小时前
Rust IDE 选型:除 VS Code 之外,RustRover 非商业场景可免费使用
ide·vscode·rust
不会代码的小猴5 小时前
6. Qt网络编程
开发语言·c++·笔记·qt·算法
MartinYeung56 小时前
[论文学习]ChainWatch:面向MCP-Based AI智能体系统中多步攻击的杀伤链对齐序贯检测框架
人工智能·学习
tq10866 小时前
从阿罗不可能定理到所有制:动态协调与资源再配置的理论逻辑
笔记