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

Rust中为何对&&str类型Vec排序会按字符串而非外层引用排序?

为什么elem_refs.sort()按字符串内容而非引用排序?

Rust里Vec::sort()的排序逻辑完全依赖元素类型实现的Ord trait,而&str类型的Ord实现根本不是比较引用的内存地址,而是比较引用指向的字符串内容的字典序。

原因很直接:Rust针对共享引用&T做了特殊的Ord实现——只要T本身实现了Ord,&T的比较就会自动解引用,用T的Ord逻辑来进行对比。拿&str来说,比较两个&str时,相当于先把它们转成底层的str类型,再按字符串内容比较,而不是对比指针地址。

关于这个行为的文档依据,你可以在Rust标准库的Ord trait实现里找到:当T: Ord + ?Sized时,&'a T的Ord实现会直接委托给T的Ord逻辑。具体到cmp方法,self.cmp(other)等价于(*self).cmp(*other),完全是按内部值来比较的。

举个实际代码例子更清楚:

fn main() {
    let words = vec!["banana", "apple", "cherry"];
    let mut elem_refs: Vec<&str> = words.iter().copied().collect();
    elem_refs.sort();
    println!("{:?}", elem_refs); // 输出 ["apple", "banana", "cherry"]
}

如果真的需要按引用地址排序,得手动用sort_by指定比较逻辑,比如:

elem_refs.sort_by(|a, b| std::ptr::addr_of!(*a).cmp(&std::ptr::addr_of!(*b)));

不过这种需求在实际开发里几乎碰不到,大部分场景都是按内容排序更合理。

内容的提问来源于stack exchange,提问作者philip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:56:02