MST

星途 面试题库

面试题:Rust结构体关联函数类型约束与泛型结合

定义一个泛型结构体`Stack<T>`,用于实现栈结构,包含一个`Vec<T>`类型的字段`items`。实现一个关联函数`new_with_capacity`,该函数接受一个`usize`类型的参数`capacity`,用于初始化栈的容量。在类型约束上,要求当`T`实现了`Clone`和`Debug` trait 时,该函数才能够编译通过。同时,在函数内部,根据传入的`capacity`预先分配足够的空间。另外,再实现一个关联函数`pop_if`,接受一个闭包作为参数,该闭包接受`&T`类型参数并返回`bool`,只有当闭包对栈顶元素返回`true`时,才执行弹出操作并返回弹出的元素,返回类型为`Option<T>`。请写出完整代码,并对代码的设计思路进行简要说明。
35.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fmt::Debug;

// 定义泛型结构体Stack<T>
struct Stack<T> {
    items: Vec<T>,
}

impl<T: Clone + Debug> Stack<T> {
    // 关联函数new_with_capacity,初始化栈的容量
    fn new_with_capacity(capacity: usize) -> Self {
        Stack {
            items: Vec::with_capacity(capacity),
        }
    }

    // 关联函数pop_if,根据闭包条件弹出栈顶元素
    fn pop_if(&mut self, f: impl Fn(&T) -> bool) -> Option<T> {
        if let Some(top) = self.items.last() {
            if (f)(top) {
                return self.items.pop();
            }
        }
        None
    }
}

设计思路说明

  1. 结构体定义:定义了一个泛型结构体Stack<T>,它有一个Vec<T>类型的字段items,用于存储栈中的元素。
  2. 类型约束:在impl块中对T添加了CloneDebug的trait约束,确保在new_with_capacity函数使用T的相关功能时能够编译通过,例如Vec的某些操作可能需要元素类型实现Clone
  3. new_with_capacity函数:这个函数接受一个usize类型的参数capacity,使用Vec::with_capacity方法预先为items分配足够的空间,从而提高后续插入元素的效率。
  4. pop_if函数:该函数接受一个闭包f作为参数,闭包接受&T类型参数并返回bool。首先通过self.items.last()获取栈顶元素的引用,如果存在栈顶元素且闭包对栈顶元素返回true,则使用self.items.pop()弹出栈顶元素并返回,否则返回None