fn filter_range<T: PartialOrd + Copy>(slice: &[T], lower: T, upper: T) -> Vec<T> {
slice.iter()
.filter(|&&value| value >= lower && value <= upper)
.cloned()
.collect()
}
类型约束和泛型实现的考虑
- 类型约束:
T: PartialOrd
:因为需要比较切片中的元素与 lower
和 upper
的大小关系,PartialOrd
特征提供了部分排序的能力,允许使用 >=
和 <=
等比较操作符。如果使用 Ord
特征,它要求类型实现全序关系,可能在某些场景下过于严格,而 PartialOrd
更为灵活,适用于更多类型。
T: Copy
:在 filter
操作后使用 cloned
方法,cloned
方法会克隆元素,这要求类型实现 Copy
特征。如果类型没有实现 Copy
,则可以考虑使用 to_owned
方法,但这可能会带来更多的性能开销,特别是对于大型复杂类型。通过要求 Copy
特征,代码可以更高效地处理简单类型,如整数类型 i32
、u64
等。
- 泛型实现:
- 使用泛型参数
T
来表示切片中元素的类型,这样函数可以在不同数字类型(如 i32
、u64
等)上工作。
- 函数接受一个切片
&[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 中动态大小的数组,方便存储和返回筛选后的元素。