在Rust中嵌套if语句中组合else子句

时间:2017-09-01 12:37:22

标签: rust

在Rust中是否有惯用的方法来执行以下操作:

let z =
    if (condition1) {
        do_something();
        if (condition2) {
            x
        } else {
            y
        }
    } else {
        y
    }

可替换地:

let z =
    if (condition1 && condition2) {
        do_something();
        x
    } else if (condition1) {
        do_something();
        y
    } else {
        y
    }

当然,如果这是一种完全命令式的语言(并且这是一个函数),我可以将两个else子句结合起来:

if (condition1) {
    do_something();
    if (condition2) {
        return x;
    }
}

return y;

但我无法使用:

let z =
{
    if (condition1) {
        do_something();
        if (condition2) {
            return x;
        }
    }

    return y;
}

但由于内部和外部if语句(对于第一个示例)必须求值为T类型的对象,并且无法求值为(),这似乎不可能例如,在通过评估if语句定义变量时,可以在所有情况下使用。还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用闭包

let z = (|| {
    if condition1 {
        do_something();
        if condition2 {
            return x;
        }
    };
    y 
})();

答案 1 :(得分:3)

您可以使用loop break值:

let z = loop {
    if condition1 {
        do_something();
        if condition2 {
            break x;
        }
    }

    break y;
};

RFC open now允许常规块来做到这一点,以避免这种永不循环的循环。