模式匹配时如何避免冗余函数调用?

时间:2017-10-15 21:09:49

标签: rust

如果没有必要,我想匹配几个函数结果而不调用所有函数结果:

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"),
}

我该怎么做?

2 个答案:

答案 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")
};