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
相关产品推荐
相关产品推荐

