我正在查看文档,发现了一个看起来不熟悉的示例代码。
use std::cmp::Reverse;
let mut v = vec![1, 2, 3, 4, 5, 6];
v.sort_by_key(|&num| (num > 3, Reverse(num)));
assert_eq!(v, vec![3, 2, 1, 6, 5, 4]);
Run Code Online (Sandbox Code Playgroud)
如何(num > 3, Reverse(num))定义它们之间的排序?
我查看了元组的文档,它说
元组的顺序性质适用于其各种特征的实现。例如,在 PartialOrd 和 Ord 中,元素按顺序进行比较,直到找到第一个不相等的集合。
这对于平等检查是有意义的,但在我看来,它没有解释如何>和<元组的作用。
我做了一些实验,但什么也没明白。
println!("{}", (5, 5) > (3, 4)); // true
println!("{}", (2, 2) > (3, 4)); // false
println!("{}", (2, 5) > (3, 4)); // false
println!("{}", (3, 5) > (3, 4)); // true
println!("{}", (5, 2) > (3, 4)); // true
Run Code Online (Sandbox Code Playgroud)
正如您引用的注释一样,元组按字典顺序进行比较。
也就是说,比较每个元组的第一个元素,然后如果它们相等,则第二个元素相等,然后是第三个,依此类推,直到找到不相等的对并提供元组的排序。如果所有对都相等,那么元组显然是相等的。
Run Code Online (Sandbox Code Playgroud)println!("{}", (5, 5) > (3, 4)); // true
5 > 3,因此 (5, _) > (3, _)
Run Code Online (Sandbox Code Playgroud)println!("{}", (2, 2) > (3, 4)); // false
2 < 3,因此 (2, _) < (3, _)
Run Code Online (Sandbox Code Playgroud)println!("{}", (2, 5) > (3, 4)); // false
看上面
Run Code Online (Sandbox Code Playgroud)println!("{}", (3, 5) > (3, 4)); // true
3 == 3, 5 > 4,因此 (3, 5) > (3, 4)
Run Code Online (Sandbox Code Playgroud)println!("{}", (5, 2) > (3, 4)); // true
见第一种情况
如何
(num > 3, Reverse(num))定义它们之间的排序?
booleans sort false < true,因此它首先对两个大类(小于 3 的数字然后大于 3 的数字)中的元素进行排序,然后在每个类别中根据它们的反向自然顺序(即最大优先)对元素进行排序。虽然它显然是在一次传递中完成的。