如果没有必要,我想匹配几个函数结果而不调用所有函数结果:
fn foo() -> bool {
println!("foo executed");
true
}
// I want to do something like this
// but there is a redundant function call
match (foo(), foo()) {
(false, true) => println!("Bingo!"),
_ => println!("Wrong result"),
}
// No redundant function call
// but less impressive and doubling of wrong result processing
match foo() {
false => match foo() {
true => println!("Bingo"),
_ => println!("Wrong result"),
},
_ => println!("Wrong result"),
}
我该怎么做?
答案 0 :(得分:3)
您可以这样做:
if !foo() && foo() { println!("Bingo") } else { println!("Wrong result") }
Rust中的“和”(&&
)和“或”(||
)逻辑运算符是短路的,就像在大多数语言中一样。
由于!foo()
为false
,&&
的右侧将不会被评估,foo()
将不会再次被调用。
您的宏解决方案基本上是重新发明短路,至少对于这个玩具示例而言(也许它对您的实际代码更具可读性......)。
答案 1 :(得分:2)
我发现我可以用宏来美化第二种方法:
macro_rules! lazy_match {
(($condition:expr => $expect:pat) => $on_expected:expr, _ => $other:expr) => (
match $condition {
$expect => $on_expected,
_ => $other,
}
);
(
($condition:expr => $expect:pat, $($c:expr => $e:pat),+)
=> $on_expected:expr, _ => $other:expr
) => (
match $condition {
$expect => lazy_match!(($($c => $e),+) => $on_expected, _ => $other),
_ => $other,
}
);
}
lazy_match! {
(foo() => false, foo() => true) => println!("Bingo"),
_ => println!("Wrong result")
};