如何在Rust中使用自定义比较器?代码报错求正确实现方案
Rust中自定义比较器排序Vector的正确实现
你遇到的错误是因为sort_by闭包的参数a和b是引用类型(比如&i32),而整数的abs方法是为值类型实现的,引用本身没有这个方法。下面是几种修正方案:
方案1:通过模式匹配获取值
直接在闭包参数里解构引用,拿到整数本身:
use std::cmp::Ordering; fn main() { let mut v = vec![0, -4, 1, 2, 3]; v.sort_by(|&a, &b| { if a.abs() < b.abs() { Ordering::Less } else if a.abs() == b.abs() { Ordering::Equal } else { Ordering::Greater } }); println!("{:?}", v); }
方案2:显式解引用
对引用使用*操作符解引用,获取值后调用abs:
use std::cmp::Ordering; fn main() { let mut v = vec![0, -4, 1, 2, 3]; v.sort_by(|a, b| { if (*a).abs() < (*b).abs() { Ordering::Less } else if (*a).abs() == (*b).abs() { Ordering::Equal } else { Ordering::Greater } }); println!("{:?}", v); }
方案3:使用更简洁的sort_by_key
如果排序逻辑是基于某个单一的键(比如绝对值),用sort_by_key会更简洁,它内部自动处理排序逻辑:
fn main() { let mut v = vec![0, -4, 1, 2, 3]; v.sort_by_key(|x| x.abs()); println!("{:?}", v); }
三种方案运行后都会输出:[0, 1, 2, 3, -4],实现按绝对值从小到大排序的效果。
内容的提问来源于stack exchange,提问作者mascai
相关产品推荐
相关产品推荐

