我有Vector
名球员要根据以下标准进行排序:
- 乘以
championships
(降序) - 乘以
wins
(降序) - 乘以
name
(升序)
我在Rust中实现了如下内容:
use std::cmp::Ordering;
#[derive(Debug)]
struct Player {
name: String,
championships: u8,
wins: u8,
}
fn main() {
let mut players = vec![
Player {
name: "Alice".to_string(),
championships: 3,
wins: 17,
},
Player {
name: "Bob".to_string(),
championships: 3,
wins: 19,
},
Player {
name: "Claire".to_string(),
championships: 4,
wins: 18,
},
Player {
name: "Dan".to_string(),
championships: 4,
wins: 18,
},
];
players.sort_by(|a, b| match b.championships.cmp(&a.championships) {
Ordering::Less => Ordering::Less,
Ordering::Greater => Ordering::Greater,
Ordering::Equal => match b.wins.cmp(&a.wins) {
Ordering::Less => Ordering::Less,
Ordering::Greater => Ordering::Greater,
Ordering::Equal => match a.name.cmp(&b.name) {
Ordering::Less => Ordering::Less,
Ordering::Greater => Ordering::Greater,
Ordering::Equal => Ordering::Equal,
},
},
});
dbg!(players);
}
如输出所示,这可以按预期工作:
[src/main.rs:46] players = [
Player {
name: "Claire",
championships: 4,
wins: 18,
},
Player {
name: "Dan",
championships: 4,
wins: 18,
},
Player {
name: "Bob",
championships: 3,
wins: 19,
},
Player {
name: "Alice",
championships: 3,
wins: 17,
},
]
然而,模式匹配代码非常重复,因为在大多数情况下,我只返回已有的代码,例如:
Ordering::Less => Ordering::Less,
Ordering::Greater => Ordering::Greater,
有什么捷径可以避免这种冗长的话吗?
这不是一个真正的排序问题,而是一个模式匹配问题.(也许按多个标准进行排序可以用一种更优雅的方式进行,我不知道该怎么做,因为我有升序/降序的排序标准.)