我尝试在自定义比较器的帮助下对向量进行排序。在Rust中正确的方法是什么?
我的准则
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() {
return Ordering::Less;
}
return Ordering::Greater;
});
println!("{:?}", v);
}
我有一个错误
error[E0599]: no method named `abs` found for reference `&{integer}` in the current scope
--> src/main.rs:6:14
|
6 | if a.abs() < b.abs() {
| ^^^ method not found in `&{integer}`
3条答案
按热度按时间z4bn682m1#
编译器只需要很少的帮助就可以确定类型:添加类型注解
Vec
声明中:let mut v: Vec<i32> = vec![...]
Vec
的物品上:vec![0i32, -4, 1, 2, 3]
|a: &i32, b| { ... }
。kzmpq1sx2#
Chayim是正确的,但只是补充一下,您定义的排序目前还不是一个排序。它从来没有相等元素的情况(比较
3
和3
将导致Ordering::Greater
结果)。您可以显式地添加一个,但也可以使用
Ord::cmp
来为您进行三种方式的比较。cbeh67ev3#
这可以用
sort_by_key
最简洁地表示。