没有解构的比赛中的条件

时间:2015-03-27 06:06:06

标签: rust

use std::cmp::Ordering;

fn cmp(a: i32, b: i32) -> Ordering {
    match {
        _ if a < b => Ordering::Less,
        _ if a > b => Ordering::Greater,
        _ => Ordering::Equal,
    }
}

fn main() {
    let x = 5;
    let y = 10;

    println!("{}", match cmp(x, y) {
        Ordering::Less => "less",
        Ordering::Greater => "greater",
        Ordering::Equal => "equal",
    });
}

如何在match上面的函数中使用cmp条件,而不进行解构(因为没有什么可以解构)?

该代码改编自本书中众所周知的例子,该例子仅使用if / else,但是它不起作用:

src/main.rs:5:9: 5:10 error: unexpected token: `_`
src/main.rs:5         _ if a < b => Ordering::Less,
                      ^
Could not compile `match_ordering`.

我正在使用rustc 1.0.0-nightly (3ef8ff1f8 2015-02-12 00:38:24 +0000)

这样可行:

fn cmp(a: i32, b: i32) -> Ordering {
    match (a, b) {
        (a,b) if a < b => Ordering::Less,
        (a,b) if a > b => Ordering::Greater,
        _ => Ordering::Equal,
    }
}

但它会使用解构。还有其他任何方式,或者这只是最惯用,最简洁的写作方式吗?

1 个答案:

答案 0 :(得分:5)

您需要匹配某些内容,即match { ... }无效,因为match{之间需要存在某些内容。由于您不关心值本身,因此匹配单位()应该没问题:match () { ... },例如:

match () {
    _ if a < b => Ordering::Less,
    _ if a > b => Ordering::Greater,
    _ => Ordering::Equal
}

(严格来说:match { _ => ... }实际上是试图将{ ... }解析为匹配头(即匹配的表达式),_在开始时无效表达式,因此错误。)

关于idiomacity:我个人认为用match和一系列_ if ...来表达一系列短结果(如此)的条件就好了。