Rust:“sort_by”多个标准,详细模式匹配

Pat*_*her 3 sorting match rust

我有Vector一些球员要按照以下标准进行排序:

  1. championships(降序)
  2. wins(降序)
  3. 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);
}
Run Code Online (Sandbox Code Playgroud)

这按预期工作,如输出所示:

[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,
    },
]
Run Code Online (Sandbox Code Playgroud)

然而,模式匹配代码非常重复,因为在大多数情况下我只是返回我已经得到的内容,例如:

[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,
    },
]
Run Code Online (Sandbox Code Playgroud)

有什么捷径可以避免这种冗长的情况吗?

这实际上不是一个排序问题,而是一个模式匹配问题。(也许可以通过更优雅的方式按多个标准进行排序,但我不知道该怎么做,因为我有升序/降序标准进行排序。)

use*_*968 6

您的示例中的链接比较是std::cmp::Ordering::then(and then_with) 的用途:

players.sort_by(|a, b| {
    b.championships
        .cmp(&a.championships)
        .then(b.wins.cmp(&a.wins))
        .then(b.name.cmp(&a.name).reverse())
});
Run Code Online (Sandbox Code Playgroud)