在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语句定义变量时,可以在所有情况下使用。还有更好的方法吗?
答案 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允许常规块来做到这一点,以避免这种永不循环的循环。