我希望能够通过许多可能的情况来切换
在C中,我会使用
我可以只否定子条件(这里是
将子条件放入匹配保护中对我来说不是一个选项,因为它太大了。
在Rust中是否可能实现这一点,或者是否有更好的替代方案(除了创建另一个子函数或其他解决方法)?
最小示例:
x
,并且有一种情况(这里是 x == 0
),我想要检查一些额外代码的结果以确定接下来该做什么。一种可能性是从匹配中提前返回。在C中,我会使用
break
来进行早期返回,但在Rust中不允许这样做。 return
从父函数(在本例中为main()
)返回,而不仅仅是从匹配中返回(即最后的println!
不会执行!)。我可以只否定子条件(这里是
y == 0
),并缩进所有随后的代码 - 但我认为这很丑陋和难以阅读。将子条件放入匹配保护中对我来说不是一个选项,因为它太大了。
在Rust中是否可能实现这一点,或者是否有更好的替代方案(除了创建另一个子函数或其他解决方法)?
最小示例:
fn main() {
let x = 1;
match x {
1 => {
let y = 0;
/*
* do ev1l stuff to y that I don't want to put into the match-guard
* as it's simply too much.
*/
/* break early ... */
if y == 0 {break;} // > error: `break` outside of loop [E0268]
assert!(y != 0, "y was 0!");
/* do other stuff in here. */
}
_ => {}
}
println!("done matching");
}
我找到了一篇关于Rust语言中“混合匹配、变异和移动”的文章Mixing matching, mutation, and moves in Rust,这样做是否正确?
match
同时支持命令式和函数式编程风格:你可以继续使用break
语句、赋值等操作,而不必强制采用表达式导向的思维方式。
else
代码块。哦,原帖禁止了那个。也许可以用match
守卫?哦,原帖禁止了那个。创建一个函数?哦,原帖禁止了那个。” - Shepmasterbreak
的等效方法,因为在我看来,这是解决这个问题最“干净”的方式。当然,如果不可能,我会退而使用其他选项,但在我看来,这些选项对于我想要做的事情来说都是“过度杀伤力”的。 - ljrk