MST
星途 面试题库

面试题:Rust迭代器处理复杂集合转换

假设有一个`Vec<(String, i32)>`,表示一系列名称和对应的分数。使用迭代器,筛选出分数大于80的元素,并将这些元素的名称收集到一个`HashSet<String>`中。请实现此功能,并阐述在这个过程中可能涉及到的所有权转移和借用规则。
32.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::collections::HashSet;

fn main() {
    let data: Vec<(String, i32)> = vec![
        ("Alice".to_string(), 85),
        ("Bob".to_string(), 78),
        ("Charlie".to_string(), 90),
        ("David".to_string(), 75),
    ];

    let result: HashSet<String> = data.into_iter()
        .filter(|&(_, score)| score > 80)
        .map(|(name, _)| name)
        .collect();

    println!("{:?}", result);
}

所有权转移和借用规则阐述

  1. 所有权转移

    • 使用into_iter方法时,Vec<(String, i32)>的所有权被转移到迭代器中。这意味着data在调用into_iter后不再有效。
    • map方法中,(name, _)中的name(类型为String)的所有权被转移到HashSet中。HashSet现在拥有这些String的所有权。
  2. 借用规则

    • filter方法中,使用|&(_, score)| score > 80,这里使用了不可变借用&。迭代器中的每个元素(String, i32)被不可变借用,因为我们只读取score的值来进行比较,不修改元素本身。这种不可变借用遵循Rust的借用规则,即同一时间可以有多个不可变借用,但不能同时存在可变借用。

通过这种方式,代码实现了筛选和收集的功能,同时遵循了Rust严格的所有权和借用规则,确保内存安全。