对 str 引用的引用向量进行排序如何在字符串而不是最外层引用上进行?

问题描述 投票:0回答:1

在学习

rust
时,我遇到了嵌入在线问题答案中的这段代码。我没想到这是正确的答案,因为我天真地认为
elem_refs.sort()
会按向量中的引用而不是字符串进行排序。

为什么 elem_refs.sort() 对字符串进行排序,而不是对字符串的引用(或者更确切地说

&str
)?显然,这很方便并且是期望的结果,但是这种行为记录在哪里?非常感谢您的见解。

fn main() {
    let list = ["b", "d" , "q", "a", "t" ];
    let mut elem_refs: Vec<&&str> = list.iter().collect();
    println!("{:?}", elem_refs);
    elem_refs.sort();
    println!("{:?}", elem_refs);
}

["b", "d", "q", "a", "t"]

["a", "b", "d", "q", "t"]

sorting rust reference vec
1个回答
0
投票

首先,

sort
需要特征
Ord
Ord
是为引用而实现的here,它取消引用参数并再次调用
Ord::cmp

impl<A: ?Sized> Ord for &A
where
    A: Ord,
{
    #[inline]
    fn cmp(&self, other: &Self) -> Ordering {
        Ord::cmp(*self, *other)
    }
}

当您调用

sort
时,编译器会查找
Ord
的实现来实现
&&str
。它找到上面的泛型,将
&str
分配给
A
,然后根据绑定的
A: Ord
,寻找
Ord
&str
的实现。它再次找到相同的,将
str
分配给
A
,然后为
Ord
查找
str
的实现。它找到了
str
here 的具体实现,从而结束搜索。该实现链用于生成您的特定
sort
函数。

© www.soinside.com 2019 - 2024. All rights reserved.