You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:37:10