MST

星途 面试题库

面试题:Rust 泛型与数字范围界定的深度结合

设计一个泛型函数,该函数接受一个实现了 `PartialOrd` 和 `Copy` 特征的类型的切片,以及该类型的两个值 `lower` 和 `upper`,函数的功能是返回切片中值在 `lower` 到 `upper`(包含边界)之间的元素组成的新切片。要求函数在不同数字类型(如 `i32`、`u64` 等)上都能正确工作,并且要详细说明函数设计中关于类型约束和泛型实现的考虑。
27.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn filter_range<T: PartialOrd + Copy>(slice: &[T], lower: T, upper: T) -> Vec<T> {
    slice.iter()
         .filter(|&&value| value >= lower && value <= upper)
         .cloned()
         .collect()
}

类型约束和泛型实现的考虑

  1. 类型约束
    • T: PartialOrd:因为需要比较切片中的元素与 lowerupper 的大小关系,PartialOrd 特征提供了部分排序的能力,允许使用 >=<= 等比较操作符。如果使用 Ord 特征,它要求类型实现全序关系,可能在某些场景下过于严格,而 PartialOrd 更为灵活,适用于更多类型。
    • T: Copy:在 filter 操作后使用 cloned 方法,cloned 方法会克隆元素,这要求类型实现 Copy 特征。如果类型没有实现 Copy,则可以考虑使用 to_owned 方法,但这可能会带来更多的性能开销,特别是对于大型复杂类型。通过要求 Copy 特征,代码可以更高效地处理简单类型,如整数类型 i32u64 等。
  2. 泛型实现
    • 使用泛型参数 T 来表示切片中元素的类型,这样函数可以在不同数字类型(如 i32u64 等)上工作。
    • 函数接受一个切片 &[T],切片是 Rust 中常用的数组抽象,它允许在不关心具体长度的情况下处理连续内存中的数据。
    • filter 方法中,通过闭包 |&&value| value >= lower && value <= upper 来筛选出符合范围的元素。这里使用双 & 是因为 filter 方法提供的闭包参数是 &T,而 PartialOrd 操作需要 T 类型,由于 T 实现了 Copy,可以通过 && 模式匹配来获取值。
    • cloned 方法将 &T 转换为 T,因为 filter 方法返回的是 &T 类型的迭代器,而最终需要返回 Vec<T>,所以要克隆元素。
    • 最后使用 collect 方法将迭代器收集到 Vec<T> 中,Vec 是 Rust 中动态大小的数组,方便存储和返回筛选后的元素。