MST
星途 面试题库

面试题:Rust泛型类型约束在复杂数据结构中的应用

假设有一个自定义的链表数据结构`MyList`,它是一个泛型结构。现在需要实现一个方法`filter`,该方法接受一个闭包作为参数,闭包用于判断链表中的元素是否满足特定条件,`filter`方法返回一个新的`MyList`,其中仅包含满足条件的元素。请写出`MyList`的定义、`filter`方法的实现,并阐述在这个过程中你是如何处理泛型类型约束,以确保闭包可以正确作用于链表中的元素类型。
32.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义MyList链表结构
struct MyList<T> {
    head: Option<Box<Node<T>>>,
}

struct Node<T> {
    value: T,
    next: Option<Box<Node<T>>>,
}

impl<T> MyList<T> {
    // 构造函数
    fn new() -> MyList<T> {
        MyList { head: None }
    }

    // 添加元素到链表头部
    fn push(&mut self, value: T) {
        let new_node = Box::new(Node {
            value,
            next: self.head.take(),
        });
        self.head = Some(new_node);
    }

    // filter方法实现
    fn filter<F>(&self, f: F) -> MyList<T>
    where
        F: FnMut(&T) -> bool,
    {
        let mut result = MyList::new();
        let mut current = &self.head;
        while let Some(node) = current {
            if (f)(&node.value) {
                result.push(node.value.clone());
            }
            current = &node.next;
        }
        result
    }
}

泛型类型约束处理阐述

  1. 闭包类型约束:在filter方法的定义中,使用where子句对闭包F进行类型约束。F: FnMut(&T) -> bool表示闭包F必须是一个可以接受&T类型参数(即链表元素的引用)并返回bool类型结果的可调用对象。这样确保闭包可以正确作用于链表中的元素类型T
  2. 泛型一致性:整个MyList结构及其方法都是在泛型参数T的基础上定义的。filter方法返回的新MyList也使用相同的泛型参数T,保证了类型的一致性。在闭包调用(f)(&node.value)时,node.value的类型是T,与闭包参数类型约束&T相匹配,从而确保闭包能正确处理链表中的元素。