如何判断Rust的slice所有元素相等,相等时返回第一个元素的引用?
实现方案
完整代码
fn are_all_elements_equal<T: PartialEq>(elems: &[T]) -> Option<&T> { let first = elems.first()?; elems.iter().all(|elem| elem == first).then_some(first) }
代码逻辑说明
- 空切片处理:调用
elems.first()?时,如果切片为空,?运算符会直接返回None,符合空切片无相等元素的预期 - 相等校验:通过迭代器的
all()方法遍历所有元素,逐一和第一个元素对比,只要存在一个不相等的元素就立即终止遍历返回false - 返回值:如果所有元素都相等,返回包裹在
Some中的第一个元素的引用,否则返回None
测试用例
fn main() { // 你给出的元素不相等的示例 let words = &["one", "one", "one", "two"]; assert_eq!(are_all_elements_equal(words), None); // 所有元素相等的场景 let same_words = &["one", "one", "one", "one"]; assert_eq!(are_all_elements_equal(same_words), Some(&"one")); // 空切片场景 let empty_slice: &[i32] = &[]; assert_eq!(are_all_elements_equal(empty_slice), None); // 单元素切片场景 let single_elem = &[10]; assert_eq!(are_all_elements_equal(single_elem), Some(&10)); }
注意事项
- 泛型参数
T要求实现PartialEqtrait,这是Rust中进行相等比较的必要约束 - 该实现时间复杂度为O(n),空间复杂度为O(1),是该场景下的最优实现,无额外内存开销
- 返回的引用生命周期和输入切片的生命周期绑定,只要切片本身有效,返回的引用就可以安全使用
内容的提问来源于stack exchange,提问作者rodrigocfd
相关产品推荐
相关产品推荐

