在学习
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"]
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
函数。