本文简要介绍rust语言中 Enum core::ops::ControlFlow
的用法。
用法
pub enum ControlFlow<B, C = ()> {
Continue(C),
Break(B),
}
用于告诉操作是应该提前退出还是照常继续。
这用于公开您希望用户能够选择是否提前退出的事物(如图形遍历或访问者)。有了枚举就更清楚了——不用再想“等等,false
又是什么意思?” - 并允许包含一个值。
与 Option
和 Result
类似,此枚举可与 ?
运算符一起使用,以在存在 Break
变体时立即返回,或者以其他方式正常继续使用 Continue
变体中的值。
例子
Early-exiting 来自 Iterator::try_for_each
:
use std::ops::ControlFlow;
let r = (2..100).try_for_each(|x| {
if 403 % x == 0 {
return ControlFlow::Break(x)
}
ControlFlow::Continue(())
});
assert_eq!(r, ControlFlow::Break(13));
一个基本的树遍历:
use std::ops::ControlFlow;
pub struct TreeNode<T> {
value: T,
left: Option<Box<TreeNode<T>>>,
right: Option<Box<TreeNode<T>>>,
}
impl<T> TreeNode<T> {
pub fn traverse_inorder<B>(&self, f: &mut impl FnMut(&T) -> ControlFlow<B>) -> ControlFlow<B> {
if let Some(left) = &self.left {
left.traverse_inorder(f)?;
}
f(&self.value)?;
if let Some(right) = &self.right {
right.traverse_inorder(f)?;
}
ControlFlow::Continue(())
}
fn leaf(value: T) -> Option<Box<TreeNode<T>>> {
Some(Box::new(Self { value, left: None, right: None }))
}
}
let node = TreeNode {
value: 0,
left: TreeNode::leaf(1),
right: Some(Box::new(TreeNode {
value: -1,
left: TreeNode::leaf(5),
right: TreeNode::leaf(2),
}))
};
let mut sum = 0;
let res = node.traverse_inorder(&mut |val| {
if *val < 0 {
ControlFlow::Break(*val)
} else {
sum += *val;
ControlFlow::Continue(())
}
});
assert_eq!(res, ControlFlow::Break(-1));
assert_eq!(sum, 6);
变体
Continue(C)
像往常一样进入下一阶段的操作。
Break(B)
退出操作而不运行后续阶段。
相关用法
- Rust ControlFlow.break_value用法及代码示例
- Rust ControlFlow.is_break用法及代码示例
- Rust ControlFlow.is_continue用法及代码示例
- Rust Condvar.notify_all用法及代码示例
- Rust Condvar.wait用法及代码示例
- Rust Condvar.wait_timeout用法及代码示例
- Rust Condvar.wait_timeout_while用法及代码示例
- Rust Condvar.wait_while用法及代码示例
- Rust Condvar.new用法及代码示例
- Rust Condvar用法及代码示例
- Rust Condvar.notify_one用法及代码示例
- Rust Concat用法及代码示例
- Rust Condvar.wait_timeout_ms用法及代码示例
- Rust Command.args用法及代码示例
- Rust Cow.is_owned用法及代码示例
- Rust Cow用法及代码示例
- Rust Command.env用法及代码示例
- Rust Command.env_remove用法及代码示例
- Rust Command.get_args用法及代码示例
- Rust Command.stdout用法及代码示例
- Rust Command.stdin用法及代码示例
- Rust Components用法及代码示例
- Rust Component.as_os_str用法及代码示例
- Rust Command.current_dir用法及代码示例
- Rust Command.output用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Enum core::ops::ControlFlow。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。