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,
}
}
但它会使用解构。还有其他任何方式,或者这只是最惯用,最简洁的写作方式吗?
答案 0 :(得分:5)
您需要匹配某些内容,即match { ... }
无效,因为match
和{
之间需要存在某些内容。由于您不关心值本身,因此匹配单位()
应该没问题:match () { ... }
,例如:
match () {
_ if a < b => Ordering::Less,
_ if a > b => Ordering::Greater,
_ => Ordering::Equal
}
(严格来说:match { _ => ... }
实际上是试图将{ ... }
解析为匹配头(即匹配的表达式),_
在开始时无效表达式,因此错误。)
关于idiomacity:我个人认为用match
和一系列_ if ...
来表达一系列短结果(如此)的条件就好了。